Решение задачи на собеседовании по вставке в массив PHP
Давайте разберем возможное решение одной задачи при собеседовании на PHP-разработчика (web-программиста). Текст задачи:
Вставить $a в индексный (простой) массив целых чисел после всех элементов, в которых есть цифра 2. Новый массив создавать нельзя. Использовать функцию array_splice нельзя.
Общий ход решения
На первый взгляд все выглядит довольно просто. По сути можно разбить (условно) на 5 этапов:
- Инициализация (тут мы вводим переменную $a и массив + заполняем его произвольными целыми числами)
- Прохождение по массиву (foreach, например, или for)
- Определение наличия двойки в строке (strrpos нам в помощь)
- Вставка значения в массив
- Вывод результата (print_r, например)
Итак, начинаем писать код.
Решение задачи
Инициализация
$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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.