7 удобных способов сгладить массив в PHP – объяснено на примерах кода

В PHP работа с массивами — обычная задача, и иногда можно столкнуться с ситуациями, когда нужно свести многомерный массив в один уровень. Сглаживание массива означает преобразование вложенной структуры массива в одномерный массив. В этой статье блога мы рассмотрим несколько методов достижения этой цели в PHP, и по ходу дела я буду приводить примеры кода. Итак, приступим!

Метод 1: рекурсивная функция
Рекурсивный подход — один из самых простых способов выравнивания массива. Вот пример рекурсивной функции, которая может сгладить любой многомерный массив:

function flattenArrayRecursive($array) {
    $result = array();
    foreach ($array as $element) {
        if (is_array($element)) {
            $result = array_merge($result, flattenArrayRecursive($element));
        } else {
            $result[] = $element;
        }
    }
    return $result;
}

Метод 2: итеративный подход со стеком
Другой способ сгладить массив — итеративный подход с использованием структуры данных стека. Вот пример, демонстрирующий этот метод:

function flattenArrayIterative($array) {
    $stack = new SplStack();
    $stack->push($array);
    $result = array();
    while (!$stack->isEmpty()) {
        $current = $stack->pop();

        foreach ($current as $element) {
            if (is_array($element)) {
                $stack->push($element);
            } else {
                $result[] = $element;
            }
        }
    }

    return $result;
}

Метод 3: рекурсивный итератор
PHP предоставляет класс IteratorIterator, который позволяет нам рекурсивно перебирать вложенные массивы. Вот пример, в котором этот класс используется для выравнивания массива:

function flattenArrayIterator($array) {
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
    return iterator_to_array($iterator, false);
}

Метод 4: функция array_walk_recursive()
Функция array_walk_recursive()— это встроенная функция PHP, которая может быть полезна для выравнивания массивов. Вот пример, демонстрирующий его использование:

function flattenArrayWalk($array) {
    $result = array();
    array_walk_recursive($array, function ($value) use (&$result) {
        $result[] = $value;
    });
    return $result;
}

Метод 5: RecursiveClosure
Использование RecursiveClosure, представленное в PHP 7.4, — еще один элегантный способ сгладить массив. Вот пример:

$flatten = new \RecursiveIteratorIterator(
    new \RecursiveArrayIterator($array),
    \RecursiveIteratorIterator::SELF_FIRST
);
$result = [];
foreach ($flatten as $item) {
    $result[] = $item;
}

Метод 6: использование array_reduce()
Функция array_reduce()также может использоваться для выравнивания массива. Вот пример:

function flattenArrayReduce($array) {
    return array_reduce($array, function ($carry, $item) {
        return array_merge($carry, is_array($item) ? flattenArrayReduce($item) : [$item]);
    }, []);
}

Метод 7: использование итераторов и генераторов
Итераторы и генераторы PHP предоставляют мощные инструменты для управления массивами. Вот пример использования этих функций для выравнивания массива:

function flattenArrayGenerator($array) {
    foreach ($array as $element) {
        if (is_array($element)) {
            yield from flattenArrayGenerator($element);
        } else {
            yield $element;
        }
    }
}
$result = iterator_to_array(flattenArrayGenerator($array));

В этой статье мы рассмотрели семь различных способов выравнивания массива в PHP: от рекурсивных функций до итераторов и генераторов. Каждый метод имеет свои сильные стороны и подходит для различных сценариев. Понимая эти методы, вы сможете выбрать наиболее подходящий метод с учетом ваших конкретных требований.