PHP Backend | YeaHub
232 subscribers
137 photos
7 videos
243 links
Теория, подготовка к интервью и курсы для PHP разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
🤔 Какой из перечисленных типов данных в PHP не является скалярным?
Anonymous Quiz
0%
Integer
17%
String
67%
Array
17%
Float
#ЛитКод
Задача: 353. Design Snake Game

Разработайте игру "Змейка", которая играется на устройстве с экраном размером height x width. Поиграйте в игру онлайн, если вы не знакомы с ней.

Змейка изначально находится в верхнем левом углу (0, 0) с длиной в 1 единицу.
Вам дан массив food, где food[i] = (ri, ci) представляет собой строку и столбец позиции пищи, которую змейка может съесть. Когда змейка съедает кусочек пищи, ее длина и очки игры увеличиваются на 1.
Каждый кусочек пищи появляется по очереди на экране, то есть второй кусочек пищи не появится, пока змейка не съест первый кусочек пищи.
Когда кусочек пищи появляется на экране, гарантируется, что он не появится на блоке, занятом змейкой.
Игра заканчивается, если змейка выходит за пределы экрана (врезается в стену) или если ее голова занимает пространство, которое занимает ее тело после движения (например, змейка длиной 4 не может врезаться в себя).

Реализуйте класс SnakeGame:
SnakeGame(int width, int height, int[][] food) Инициализирует объект с экраном размером height x width и позициями пищи.
int move(String direction) Возвращает счет игры после применения одного движения змейки в направлении. Если игра окончена, верните -1.

Пример:
Input
["SnakeGame", "move", "move", "move", "move", "move", "move"]
[[3, 2, [[1, 2], [0, 1]]], ["R"], ["D"], ["R"], ["U"], ["L"], ["U"]]
Output
[null, 0, 0, 1, 1, 2, -1]


👨‍💻 Алгоритм:

1⃣Инициализируйте объекты игры, такие как экран, еда, положение змейки и счетчик, в конструкторе.

2⃣Реализуйте функцию для вычисления нового положения головы змейки на основе направления движения.

3⃣Обновите положение змейки и проверьте условия завершения игры. Верните текущий счет или -1, если игра закончена.

😊 Решение:
class SnakeGame {
private $width;
private $height;
private $food;
private $score;
private $snake;
private $snakeSet;
private $foodIndex;

function __construct($width, $height, $food) {
$this->width = $width;
$this->height = $height;
$this->food = $food;
$this->score = 0;
$this->snake = [[0, 0]];
$this->snakeSet = ['0,0' => true];
$this->foodIndex = 0;
}

function move($direction) {
$head = $this->snake[0];
$newHead = $head;

switch ($direction) {
case "U":
$newHead[0]--;
break;
case "D":
$newHead[0]++;
break;
case "L":
$newHead[1]--;
break;
case "R":
$newHead[1]++;
break;
}

if ($newHead[0] < 0 || $newHead[0] >= $this->height || $newHead[1] < 0 || $newHead[1] >= $this->width) {
return -1;
}

$newHeadStr = implode(',', $newHead);
if (isset($this->snakeSet[$newHeadStr]) && $newHeadStr !== implode(',', end($this->snake))) {
return -1;
}

if ($this->foodIndex < count($this->food) && $newHead[0] === $this->food[$this->foodIndex][0] && $newHead[1] === $this->food[$this->foodIndex][1]) {
$this->foodIndex++;
} else {
$tail = array_pop($this->snake);
unset($this->snakeSet[implode(',', $tail)]);
}

array_unshift($this->snake, $newHead);
$this->snakeSet[$newHeadStr] = true;

return count($this->snake) - 1;
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что означает аббревиатура PDO в контексте PHP?
Anonymous Quiz
7%
PHP Data Oriented
43%
PHP Database Object
43%
PHP Data Objects
7%
PHP Database Oriented
#ЛитКод
Задача: 616. Add Bold Tag in String

Вам дана строка s и массив строк words. Вы должны добавить закрытую пару полужирных тегов <b> и </b>, чтобы обернуть подстроки в s, которые существуют в words. Если две такие подстроки пересекаются, вы должны обернуть их вместе только одной парой закрытых полужирных тегов. Если две подстроки, обернутые полужирными тегами, идут подряд, вы должны объединить их. Верните s после добавления полужирных тегов.

Пример:
Input: s = "abcxyz123", words = ["abc","123"]
Output: "<b>abc</b>xyz<b>123</b>"


👨‍💻 Алгоритм:

1⃣Найдите все позиции вхождений подстрок из words в строку s и пометьте эти позиции для выделения тегами <b> и </b>.

2⃣Пройдитесь по помеченным позициям, чтобы определить области, которые нужно обернуть в полужирные теги, слияя пересекающиеся и смежные области.

3⃣Постройте новую строку s, добавляя теги <b> и </b> в определенные позиции.

😎 Решение:
function addBoldTag($s, $words) {
$bold = array_fill(0, strlen($s), false);

foreach ($words as $word) {
$pos = strpos($s, $word);
while ($pos !== false) {
for ($i = $pos; $i < $pos + strlen($word); $i++) {
$bold[$i] = true;
}
$pos = strpos($s, $word, $pos + 1);
}
}

$result = "";
$i = 0;
while ($i < strlen($s)) {
if ($bold[$i]) {
$result .= "<b>";
while ($i < strlen($s) && $bold[$i]) {
$result .= $s[$i];
$i++;
}
$result .= "</b>";
} else {
$result .= $s[$i];
$i++;
}
}

return $result;
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Как переопределить хранение сессий?

Хранение сессий можно переопределить путём изменения способа их хранения:
Файлы: хранение на локальной файловой системе.
Базы данных: использование реляционных баз для хранения сессий, что упрощает их масштабирование.
Кэш: хранение в Redis, Memcached для быстрого доступа.
Для настройки нужно изменить конфигурацию приложения или middleware, например, в Django, Flask или Spring.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Что известно о MVC?

Это архитектурный шаблон, который разделяет приложение на три компонента:
🟠Model: управляет данными и бизнес-логикой.
🟠View: отвечает за отображение данных пользователю.
🟠Controller: обрабатывает пользовательский ввод, связывает Model и View.
Это разделение упрощает разработку, тестирование и поддержку приложения.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Вакансии
👨‍💻 Backend PHP developer (Middle)

Локация: Удаленно
Компания: Igaming-Soft
ЗП: от 2 500 до 3 000 $
Занятость: Полная
Локация: Кипр
Трудоустройство: самозанятый
Сфера: GAMBLING

🚩Требования
🔵 Опыт работы с php 7+
🔵Опыт разработки коммерческих продуктов
🔵Понимание ООП, алгоритмов и структур данных
🔵Опыт работы со сторонними API и проектирование REST API
🔵Опыт интеграции платежных систем
🔵Базовые шаблоны проектирования
🔵Опыт работы с GIT, работа с ветками, чистота веток
🔵Опыт работы с MySQL. Агрегаты, джоины, запросы от руки. Важно уметь писать сложные запросы без фреймворков и шаблонов.
🔵консоль (bash), Linux или WSL
🔵Опыт удаленной разработки, работы в команде

🚩Будет плюсом
🔵Опыт работы с высоконагруженными системами
🔵Опыт работы с Websocket
🔵Опыт работы с Docker и/или Docker Swarm
🔵Инструменты Jira, Gitlab/Github, git flow

​​​​​​​​​​​​​💬 Резюме отправлять: @Nbagama

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Какую проблему решает декоратор?

Декоратор позволяет добавлять новую функциональность к существующему объекту или функции без изменения их исходного кода.
🟠Это решает проблему модификации поведения без нарушения принципа открытости/закрытости (SOLID).
🟠Удобен для добавления динамических изменений, таких как логирование, кэширование или аутентификация.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Какую проблему решает декоратор?

Декоратор позволяет добавлять новую функциональность к существующему объекту или функции без изменения их исходного кода.
🟠Это решает проблему модификации поведения без нарушения принципа открытости/закрытости (SOLID).
🟠Удобен для добавления динамических изменений, таких как логирование, кэширование или аутентификация.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Чем composer.json отличается от composer.lock?

🟠composer.json: содержит список зависимостей проекта и их версии (диапазоны).
🟠composer.lock: фиксирует конкретные версии зависимостей, установленных в проекте, для воспроизводимого окружения.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой метод используется для удаления куки в PHP?
Anonymous Quiz
33%
remove_cookie()
11%
delete_cookie()
33%
unset_cookie()
22%
setcookie()
#полезное
🛞 Выжимаем максимум скорости из PHP

На Хабр вышла интересная статейка о методах оптимизации производительности PHP-приложений. Речь идёт о технологиях CGI, Apache с mod_php, связка Apache и Nginx, а также PHP-FPM и PHP-PM.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой метод используется для изменения прав доступа к файлу в PHP?
Anonymous Quiz
20%
set_mode()
13%
file_chmod()
0%
change_mode()
67%
chmod()
🤔 Какой метод используется для получения информации о типе ресурса в PHP?
Anonymous Quiz
44%
get_resource_type()
38%
resource_type()
0%
type_resource()
19%
get_type_resource()
#ЛитКод
Задача: 605. Can Place Flowers

У вас есть длинная клумба, на которой некоторые участки засажены, а некоторые нет. Однако цветы нельзя сажать на соседних участках.

Дан целочисленный массив flowerbed, содержащий 0 и 1, где 0 означает пустой участок, а 1 — занятый участок, и целое число n. Верните true, если n новых цветов можно посадить на клумбе, не нарушая правила о соседних цветах, и false в противном случае.

Пример
Input: flowerbed = [1,0,0,0,1], n = 1
Output: true


👨‍💻 Алгоритм:

1⃣Решение очень простое. Мы можем определить максимальное количество дополнительных цветов, count, которые можно посадить для данного расположения клумбы. Для этого мы проходим по всем элементам массива flowerbed и находим те элементы, которые равны 0 (означает пустую позицию).

2⃣Для каждого такого элемента проверяем, пусты ли обе его соседние позиции. Если да, мы можем посадить цветок в текущей позиции, не нарушая правило соседних цветов. Для первого и последнего элементов не нужно проверять предыдущие и следующие соседние позиции соответственно.

3⃣Если полученное количество count больше или равно n, требуемому количеству цветов для посадки, мы можем посадить n цветов на пустые места, иначе - нет.

😎 Решение:
class Solution {
function canPlaceFlowers($flowerbed, $n) {
$count = 0;
for ($i = 0; $i < count($flowerbed); $i++) {
if ($flowerbed[$i] == 0) {
$emptyLeft = $i == 0 || $flowerbed[$i - 1] == 0;
$emptyRight = $i == count($flowerbed) - 1 || $flowerbed[$i + 1] == 0;
if ($emptyLeft && $emptyRight) {
$flowerbed[$i] = 1;
$count++;
}
}
}
return $count >= $n;
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой параметр cURL используется для установки аутентификации с использованием логина и пароля?
Anonymous Quiz
0%
CURLOPT_USERPWD
7%
CURLOPT_LOGIN
80%
CURLOPT_AUTH
13%
CURLOPT_CREDENTIALS
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 PHP TUI

Мощный фреймворк для создания консольных приложений на PHP с псевдографическим пользовательским интерфейсом.
Читать статью

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Как работает жизненный цикл запроса в PHP?

Жизненный цикл запроса в РНР начинается с получения НТТР-запроса сервером. Сервер передает запрос РНР-интерпретатору, который выполняет скрипт, взаимодействует с базой данных (если требуется), и генерирует ответ в формате HTML или другого типа контента. Ответ отправляется клиенту, где отображается в браузере. Каждый запрос обрабатывается изолированно, и состояние приложения между запросами не сохраняется без использования сессий или базы данных.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЛитКод
Задача: 621. Task Scheduler

Вам дан массив задач процессора, каждая из которых представлена буквами от A до Z, и время охлаждения, n. Каждый цикл или интервал позволяет завершить одну задачу. Задачи могут быть выполнены в любом порядке, но есть ограничение: одинаковые задачи должны быть разделены не менее чем n интервалами из-за времени охлаждения. Верните минимальное количество интервалов, необходимое для выполнения всех задач.

Пример:
Input: tasks = ["A","A","A","B","B","B"], n = 2
Output: 8


👨‍💻 Алгоритм:

1⃣Подсчитайте количество каждой задачи и найдите максимальное количество вхождений (maxFreq).

2⃣Вычислите количество интервалов, необходимых для задач с maxFreq: (maxFreq - 1) * (n + 1) + countMaxFreq, где countMaxFreq - количество задач, имеющих maxFreq.

3⃣Верните максимум между вычисленным значением и длиной массива задач, поскольку некоторые задачи могут заполнять интервал до n.

😎 Решение:
function leastInterval($tasks, $n) {
$taskCounts = array_count_values($tasks);
$maxFreq = max($taskCounts);
$countMaxFreq = count(array_filter($taskCounts, function($count) use ($maxFreq) {
return $count == $maxFreq;
}));

return max(count($tasks), ($maxFreq - 1) * ($n + 1) + $countMaxFreq);
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM