Привет, Хабр!

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

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

Для старта достаточно клонировать сборник себе и начать описывать реализацию, все оставльное уже есть. Есть готовые входящие данные для задач, есть 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(), но тут важен контекст собеседования. Если Вам ставят задачу сформулированную именно так и вы на собеседовании, то вероятнее всего, такая задача преследует единственную цель, а именно оценить вашу алгоритмическую подготовку. Надеюсь, это понятно.

Комментарии (31)


  1. zenn
    15.09.2015 19:41
    +2

    Очень плачевно видеть на хабре записи, которые бы поместились в твит… Привели бы хоть пару примеров что-ли, что-зачем и для чего лежит в этом репозитории…


    1. MaxZN
      15.09.2015 20:03
      -4

      Да, надо бы добавить примеры, чуть позже добавлю.


      1. Wedmer
        15.09.2015 20:11
        -1

        Чем быстрее, тем лучше.


      1. MaxZN
        16.09.2015 09:45
        +1

        Добавил, еще раз прошу прощения, нужно было сразу с примерами. На будущее учту. И спасибо за обратную связь.)


    1. Wedmer
      15.09.2015 20:09

      Пора вводить сервис «Хабратвит». Тогда может и полезной активности чуток больше будет.


      1. SerafimArts
        16.09.2015 00:48
        +2

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


  1. Elfet
    15.09.2015 19:48
    +3

    Мдаа. Откуда только берутся такие статьи? Последнее время что-то интересное бывает только в дайджесте, и все…


  1. andrewnester
    15.09.2015 20:01
    +2

    так еще и задачки так себе


    1. MaxZN
      15.09.2015 20:06
      -5

      Если у Вас есть идеи какими задачами дополнить сборник — присылайте, буду благодарен.


      1. andrewnester
        15.09.2015 21:30
        +4

        а если мне не нравится объективно плохой музыкальный исполнитель, что мне ему отвечать на предложение — «есть песни получше — присылайте»?


  1. KvanTTT
    16.09.2015 01:04
    +2

    Реально на собеседованиях php спрашивают такие «практические» задачи?
    Да и не понимаю людей, которые выкладывают такие бессмысленные статьи.


    1. MaxZN
      16.09.2015 10:29

      Да, спрашивают.

      Например http://hh.ru/employer/986766 — petrosoft или http://hh.ru/employer/594876 — Adoriasoft. В первой Вам предоставят онлайн блокнотик, где предложат решить ряд подобный задачек, во второй придется пройти онлайн тестирование, которое также содержит похожие задачки.


  1. NorthDakota
    16.09.2015 01:29
    -1

    Отсортировать одномерный массив своими силами

    Мы такие задачи в универе решали для паскаля…

    Уже представляю набраную команду людей, которые всё делают своими силами, ибо не знают встроеных функций… Жуть…


    1. REZ1DENT3
      16.09.2015 09:56

      на собеседовании работодатель должен удостовериться, что ты хотя бы можешь написать сортировку массива ) Так сказать проверка на вменяемость. Зачем ему давать тебе Т/З от важного клиента, если ты не знаешь обыкновенный алгоритм сортировки методом пузырька/Хоара(рекурсивная и не рекурсивная)/бинарная…

      А сортировка массива и в паскале есть из коробки.


      1. NorthDakota
        16.09.2015 11:42

        Ой всё. За моими плечами не одно собеседование на должность php разработчика. Ни на одном не спросили про сортировку.
        Да, были вопросы про построение дерева, и прочие.

        А сортировка массива и в паскале есть из коробки.


        А я вот возьму, и неповерю вам наслово.


  1. Metus
    16.09.2015 09:27

    А зачем нужны какие-то сторонние плагины вроде firephp?
    Неужели так сложно работать с консолью?
    И зачем нужен этот один несчастный интерфейс?


    1. MaxZN
      16.09.2015 09:53

      И зачем нужен этот один несчастный интерфейс? — Из предыдущей версии статьи это было не ясно, но интерфейс не один. Сорри, добавил примеры и улучшил описание, перечитайте статью.

      Неужели так сложно работать с консолью?
      А зачем нужны какие-то сторонние плагины вроде firephp? — отвечу на оба вопроса. Это дело вкуса, используйте консоль, если Вам так удобно. Вас никто не принуждает использовать firephp. Однако, консоль браузера представляется мне более удобной альтернативой var_dump() или print_r() в консоли.

      К тому же я использую firephp в связке с livereload и gulp. Попробуйте, Вы не пожалеете.


  1. maxru
    16.09.2015 12:30

    Тесты на знание метода сортировки пузырьком?


  1. snnwolf
    16.09.2015 13:30

    Поправил новичку один очень простой код (выложил на гисте).
    Потом больше часа объяснял как нужно править. Почему-то эту задачку еще 2 технаря решали долго. Не знаю может стресс виноват.


    1. MaxZN
      16.09.2015 16:20

      Скорее всего стресс. Мозги лучше работают в спокойной обстановке и тишине, когда ничто не мешает концентрироваться на задаче. Когда мне, на собеседовании, предложили порешать задачки в блокнотике я оказался не готов к этому. Волнение и стресс сделали свое дело и я завалил собеседование.


  1. servekon
    16.09.2015 13:41

    Отсортировать массив лучше не своими силами, а силами самого PHP:

    <?php
    
    function arr_sort_funct($a, $b) {
      if ($a == $b) {
          return 0;
      }
      return ($a < $b) ? -1 : 1;
    }
    
    uasort($arr, 'arr_sort_funct');
    
    ?>
    


    1. MaxZN
      16.09.2015 16:08

      Так короче:

      uasort($arr, function($a,$b) {
          if ($a == $b) return 0;
          return ($a < $b) ? -1 : 1;
      });
      


      Но дело не в этом.
      Сборник содержит, только простые задачи, которые встречаются в рамках собеседования. По этой причине некоторые задачи содержат формулировки вроде: «Отсортировать одномерный массив своими силами» Да, в php есть много встроеных функций для работы с массивами, но тут важен контекст собеседования. Если Вам ставят задачу сформулированную именно так и вы на собеседовании, то вероятнее всего, такая задача преследует единственную цель, а именно оценить вашу алгоритмическую подготовку. Надеюсь, это понятно.


  1. skobkin
    16.09.2015 16:37

    Можно было бы заодно ещё и проверить умение кандидатов пользоваться Composer, оформив это в виде пакета и потребовав подключать через нормальный автолоадер.

    Однако, консоль браузера представляется мне более удобной альтернативой var_dump() или print_r() )

    Более удобной, чем XDebug и phpdbg?


    1. MaxZN
      16.09.2015 17:55
      -2

      Да, если лень ставить XDebug и phpdbg чтобы посмотреть пару переменных.


      1. SerafimArts
        16.09.2015 19:47

        phpdbg идёт из коробки. Однако здравствуйте: http://phpdbg.com/


        1. MaxZN
          16.09.2015 21:26

          а в версиях 5.3 и 5.4?


          1. SerafimArts
            16.09.2015 21:54

            1) Они deprecated (http://php.net/eol.php)
            2) Использовать дебаггер\вывод логов в консоль на продакшене? (локально можно любую версию влепить)


            1. MaxZN
              17.09.2015 11:05

              1) То, что они deprecated еще не значит, что их никто не использует.
              2) Это не совсем применимо к реальности. Видите ли, версии php могут отличаться друг от друга и не обладать обратной совместимостью. Возьмем версии 5.3 и 5.4 http://php.net/manual/en/migration54.incompatible.php

              Могу также привести пример из собственной практики:
              Полтора года назад, меня пригласили поддерживать устоявшийся проект. Он был написан на версии 5.3, а у меня на тот момент, локально, стояла версия 5.5 Так вот, под 5.5 проект не запустился по причине обратной не совместимости версий php. Тут важно понимать, что «семеро одного не ждут» и то, что у вас проект не ставится под вашу версию php — это только ваша проблема и ничья больше. Я откатил версию до 5.3 и включился в работу.


              1. Metus
                17.09.2015 12:13

                Это не «только ваша проблема».
                Это как минимум проблема:
                * невозможности использовать новые удобные библиотеки (или обновить существующие)
                * невозможности обновить php-интерпретатор или расширение, если там обнаружено какое-то некорректное поведение
                А это увеличение времени разработки, баги и прочие «радости».

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


                1. MaxZN
                  17.09.2015 13:05

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

                  Об этом можно долго рассуждать, но мир таков каков есть и то, что мы от него ждем, может идти вразрез с тем, что в итоге от него получаем.

                  Выше человек задал вопрос и я просто привел реальный пример в качестве иллюстрации — вот и все.


            1. MaxZN
              17.09.2015 11:12

              Но я еще раз повторюсь, Вас никто не принуждает. Если вам удобно работать с XDebug, ну и отлично — каждый работает так как ему удобнее.