Как стать автором
Обновить

Сборник практических задач PHP для подготовки к собеседованию

Время на прочтение4 мин
Количество просмотров42K
Привет, Хабр!

Хотел бы поделиться небольшим сборником практических задач, которые могут встречаться на собеседовании.

На просторах хабра и сети имеется множество сборников вопросов для подготовки к устной части собеседования, а вот сборника практических задач, который было бы удобно использовать для подготовки — не нашлось.

Для старта достаточно клонировать сборник себе и начать описывать реализацию, все оставльное уже есть. Есть готовые входящие данные для задач, есть FB класс, который позволяет уйти от var_dump() или print_r(). Все есть, поставил и сразу можно выполнять задачи — без лишней суеты. Надеюсь, кому-нибудь это окажется нужным.


Как пользоваться?
Для удобства, задачи представилены несколькими интерфейсами папка на Github. Возьмем интерфейс ITestSortInterface (/src/Training) в качестве иллюстрации. Из названия видно, что в нем лежат задачи по сортировке:
<?php
namespace Training;


interface ITestSortInterface
{
    /**
     * Отсортировать одномерный массив своими силами
     *
     * На входе array(2,5,3,5,6,7,8,9,25,24,18,26,27,28,29,30,31)
     * На выходе отсортированный массив
     */
    public function testSort1($array);

    /**
     * Отсортировать двумерный массив пришедший из БД
     *
     * На входе array(
     *  '1'=>array('price'=>10,'count'=>2),
     *  '2'=>array('price'=>5,'count'=>5),
     *  '3'=>array('price'=>8,'count'=>5),
     *  '4'=>array('price'=>12,'count'=>4),
     *  '5'=>array('price'=>8,'count'=>4),
     * )
     * На выходе отсортированный массив
     *  по 'price' DESC и во вторую очередь по 'count' DESC
     * array(
     *  '2'=>array('price'=>5,'count'=>2),
     *  '5'=>array('price'=>8,'count'=>4),
     *  '3'=>array('price'=>8,'count'=>5),
     *  '1'=>array('price'=>10,'count'=>5),
     *  '4'=>array('price'=>12,'count'=>4),
     * )
     *
     */
    public function testSort2($array);

    /**
     * Отсортировать числа на диагонали квадратной матрицы
     * На входе квадратная матрица
     * array(
     *  array(10,5,3,6),
     *  array(8,2,11,13),
     *  array(9,25,30,18),
     *  array(34,37,38,24)
     * )
     *
     * На выходе должен быть массив
     * array(
     *  array(2,5,3,6),
     *  array(8,10,11,13),
     *  array(9,25,24,18),
     *  array(34,37,38,30)
     * )
     *
     */
    public function testSort3($array);
}



Для начала выполнения заданий необходимо создать класс имплементирующий желаемые интерфейсы. Я назвал свой класс Test:
<?php
// Подгрузка файлов
require_once('loader.php');

use Training\ITestSortInterface;
use Training\Data;

// Класс Test реализует интерфейс ITestSortInterface
class Test implements ITestSortInterface
{
    /**
     * Отсортировать одномерный массив своими силами
     *
     * На входе array(2,5,3,5,6,7,8,9,25,24,18,26,27,28,29,30,31)
     * На выходе отсортированный массив
     */
    public function testSort1($array)
    {
        // Условие окончания рекурсии
        if (!$lenght = count($array)) return $array;

        // Обнуляем
        $x = $y = array();

        // Те, что меньше первого элемента в одну сторону, те что больше в другую.
        // А что-бы цыкл не ушел в бесконечность начинаем его с $i = 1
        for ($i = 1; $i < $lenght; $i++) {
            if ($array[$i] > $array[0]) $x[] = $array[$i];
            else $y[] = $array[$i];
        }

        return array_merge($this->testSort1($y), array($array[0]), $this->testSort1($x));
    }

    /**
     * Отсортировать двумерный массив пришедший из БД
     *
     * На входе array(
     *  '1'=>array('price'=>10,'count'=>2),
     *  '2'=>array('price'=>5,'count'=>5),
     *  '3'=>array('price'=>8,'count'=>5),
     *  '4'=>array('price'=>12,'count'=>4),
     *  '5'=>array('price'=>8,'count'=>4),
     * )
     * На выходе отсортированный массив
     *  по 'price' DESC и во вторую очередь по 'count' DESC
     * array(
     *  '2'=>array('price'=>5,'count'=>2),
     *  '5'=>array('price'=>8,'count'=>4),
     *  '3'=>array('price'=>8,'count'=>5),
     *  '1'=>array('price'=>10,'count'=>5),
     *  '4'=>array('price'=>12,'count'=>4),
     * )
     *
     */
    public function testSort2($array)
    {
        // TODO: Implement testSort2() method.
    }

    /**
     * Отсортировать числа на диагонали квадратной матрицы
     * На входе квадратная матрица
     * array(
     *  array(10,5,3,6),
     *  array(8,2,11,13),
     *  array(9,25,30,18),
     *  array(34,37,38,24)
     * )
     *
     * На выходе должен быть массив
     * array(
     *  array(2,5,3,6),
     *  array(8,10,11,13),
     *  array(9,25,24,18),
     *  array(34,37,38,30)
     * )
     *
     */
    public function testSort3($array)
    {
        // TODO: Implement testSort3() method.
    }

}

$test = new Test();
/**
 * Тут подробнее.
 * \FireDog\FB::info() - выводит дебаг инфу в консоль сервера
 * Data::getData(Data::ARR_SIMPL_INT) - предоставляет готовые данные для заданий
 */
\FireDog\FB::info($test->testSort1(Data::getData(Data::ARR_SIMPL_INT)));

Тут используются два вспомогательных класса \FireDog\FB и Training\Data. ( Позвольте небольшую ремарку: Использование FB или Data не обязательно — это вспомогательные классы для удобства. Однако, консоль браузера представляется мне более удобной альтернативой var_dump() или print_r() )
Первый выводит дебаг инфу в консоль браузера:
image
Для браузера потребуется установка плагина firephp. Тут плагин для Хрома.
Второй класс Data, хранит готовые данные для заданий. Для задания $test->testSort1() нам нужен массив array(2,5,3,5,6,7,8,9,25,24,18,26,27,28,29,30,31) его то мы и получаем Data::getData(Data::ARR_SIMPL_INT)

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

Сборник на Github

P.S.
Сборник содержит, только простые задачи, которые встречаются в рамках собеседования. По этой причине некоторые задачи содержат формулировки вроде: «Отсортировать одномерный массив своими силами» Да-да, есть функция sort(), но тут важен контекст собеседования. Если Вам ставят задачу сформулированную именно так и вы на собеседовании, то вероятнее всего, такая задача преследует единственную цель, а именно оценить вашу алгоритмическую подготовку. Надеюсь, это понятно.
Теги:
Хабы:
-15
Комментарии31

Публикации

Изменить настройки темы

Истории

Работа

PHP программист
155 вакансий

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн