Реверсирование массива в PHP с помощью рекурсии

Давайте вернемся к теме из учебника по информатике. Покажем вам, как развернуть массив в 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

Оцените статью
Procodings.ru
Добавить комментарий