Давайте вернемся к теме из учебника по информатике. Покажем вам, как развернуть массив в PHP без использования собственных функций массива, таких как array_xxx().
Рекурсия
Рекурсия — это процесс в информатике, позволяющий заставить функцию вызывать саму себя. Соответствующая функция называется рекурсивной. Некоторые сложные задачи можно легко решить с помощью рекурсивного метода.
Лучший способ понять рекурсивную функцию — показать ее на примере чисел Фибоначчи. Числа Фибоначчи можно определить как:
F(0) = 0, F(1) = 1
F(N) = F(N-1) + F(N-2) (N > 1)
Рекурсивная функция для нунмберов Фибоначчи такова:
function F(int $n): int {
if ($n == 0) return 0; // Stop condition
if ($n == 1) return 1; // Stop condition
return F($n - 1) + F($n - 2);
}
echo 'F(18) = ' . F(18); // F(18) = 2584
Самое важное в рекурсивной функции — это условие остановки, когда функция перестает вызывать саму себя. В приведенном выше фрагменте кода есть два условия остановки:
if ($n == 0) return 0;
и
if ($n == 1) return 1;
Эти условия остановки являются случаями для F(0) = 0
и F(1) = 1
. Когда N > 1
, рекурсивная функция вызывает сама себя и возвращает значение F($n - 1) + F($n - 2)
. Если условие остановки не определено, рекурсивная функция может столкнуться с проблемой бесконечной рекурсии. Это похоже на случай бесконечного зацикливания.
Рекурсия массива
Это пример использования рекурсии для реверсирования массива без использования собственных функций массива, то есть array_xxx(), в PHP.
Мы определяем рекурсивную функцию reverseArray(array $array)
для реверсирования массива. Она перебирает входной массив и меняет положение каждого элемента, вызывая функцию insertToFront()
, где каждый элемент, считанный из входного массива, помещается в начало возвращаемого массива $result
.
function reverseArray(array $array) {
$result = [];
foreach ($array as $key => $value) {
// check if it is an array
if (is_array($value)) {
// insert into the front of the result array
$result = insertToFront($key, reverseArray($value), $result);
continue;
}
$result = insertToFront($key, $value, $result);
}
return $result;
}
В рекурсивной функции reverseArray(array $array)
условием остановки является случай, когда тип значения элемента не является массивом. Каждый элемент итерируемого массива по очереди помещается на передний план возвращаемого массива $result
:
$result = insertToFront($key, $value, $result);
Если тип значения элемента является массивом, то вызывается рекурсивная функция, чтобы развернуть этот массив:
$result = insertToFront($key, reverseArray($value), $result);
Процесс помещения элемента массива на передний план возвращаемого массива выглядит следующим образом:
function insertToFront($key, $value, $array) {
$result = [];
// insert into the front of the result array
$result[$key] = $value;
// append all the rest data
foreach ($array as $oldKey => $oldValue) {
$result[$oldKey] = $oldValue;
}
return $result;
}
Чтобы проверить рекурсивную функцию reverseArray(array $array)
, сначала проведем проверку с индексированным массивом:
// Indexed array
$inputArray = [1, 2, 3, 4, 5];
echo 'Before Reverse:' . PHP_EOL;
var_dump($inputArray);
echo 'After Reverse:' . PHP_EOL;
var_dump(reverseArray($inputArray));
…
Для ознакомления с остальным содержимым, пожалуйста, перейдите по ссылке ниже:
https://www.codebilby.com/blog/a41-reverse-an-array-in-php-by-using-recursion