Решение задачи на собеседовании по вставке в массив PHP


Давайте разберем возможное решение одной задачи при собеседовании на PHP-разработчика (web-программиста). Текст задачи:

Вставить $a в индексный (простой) массив целых чисел после всех элементов, в которых есть цифра 2. Новый массив создавать нельзя. Использовать функцию array_splice нельзя.

Общий ход решения

На первый взгляд все выглядит довольно просто. По сути можно разбить (условно) на 5 этапов:

  1. Инициализация (тут мы вводим переменную $a и массив + заполняем его произвольными целыми числами)
  2. Прохождение по массиву (foreach, например, или for)
  3. Определение наличия двойки в строке (strrpos нам в помощь)
  4. Вставка значения в массив
  5. Вывод результата (print_r, например)
Пункты 1 и 5 необязательно, но lля наглядности введем их. Мы же хотим произвести хорошее впечатление на будущего работодателя, верно?

Итак, начинаем писать код.

Решение задачи

Инициализация

$a = 1;
$arr = array(22, 45, 22, 34, 234, 234, 657, 2, 22, 0, 2);
Пусть будет число 1 вставлять после тех, в которых содержаться двойки. А массив $arr начнём и закончим с таких чисел – чтобы заведомо обработать крайние случаи.

Прохождение по массиву

Цикл используем for, для этого предварительно найдем длину массива. Вообще, можно и сразу count($arr) в условии цикла поставить, но в таком случае наш интерпретатор PHP каждый раз будет вычислять размер, так что немного оптимизируем сразу программу.

$len = count($arr);
for ($i = 0; $i < $len; $i++){
Определение наличия двойки в строке

Воспользуемся обычной функцией strrpos, определяющей номер символа в строке:

if (strrpos($arr[$i], "2") !== false) {
Обратите внимание, что равенство (точнее неравенство) строгое, так как здесь может быть нуль (первая позиция), он же в некоторых случаях проходит за false.

Вставка значения в массив

А вот тут самое интересное. Нам надо после текущего элемента ($arr[$i]) вставить $a. Если просто присвоить следующему ($arr[$i+1] = $a), то тогда куда девать бывшее значение $arr[$i+1]? Если бы можно было создать новый массив, то мы бы с самого начала его создали и благополучно в него помещали все значения, когда доходили до двоек – еще и $a.

Но так делать нельзя по условию задачи, поэтому придется задействовать еще один цикл – для сдвига всех элементов на единицу. Код:

$len++;
for ($j = $len - 1; $j > $i; $j--){
    $arr[$j] = $arr[$j-1];
}        
$i++;
$arr[$i] = $a;
Разберем его построчно. В первой строке мы прибавляем единицу к длине массива, что логично – мы же добавляем элемент. Во второй начинаем цикл обхода массива с конца до текущего элемента. В третьей переназначаем значения элементов массива со сдвигом в единицу. В пятой сразу переключаем счётчик i на единицу вперёд. Ну и в шестой строке вставляем $a в нужное место.

Очень удобно, кстати, что в PHP при инициализации массива не задаётся его размер. В других языках, например, C#, программа должна знать точный размер массива перед его использованием, так что в случае неизвестных значений приходится использовать коллекции.

Вывод результата

И самый последний, самый простой пункт:

print_r($arr);
В итоге код будет выглядеть так:

$a = 1;
$arr = array(22, 45, 22, 34, 234, 234, 657, 2, 22, 0, 2);

$len = count($arr);
for ($i = 0; $i < $len; $i++){
    if (strrpos($arr[$i], "2") !== false) {
        $len++;
        for ($j = $len - 1; $j > $i; $j--){
                $arr[$j] = $arr[$j-1];
        }        
        $i++;
        $arr[$i] = $a;
    }
}

print_r($arr);
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, php, задачи, собеседование
Читайте также:




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Подключение к sql-серверу и асинхронность
Особенности перенаправления с google.com
Урок 11. Операторы сравнения в C#