Оператор разбрасывания спешит на помощь.
Сглаживание одноуровневого массива
Я видел людей, использующих функцию array_merge
в цикле вроде:
$lists = [ [1, 2], [3, 4], [5, 6], ]; $merged = []; foreach($lists as $list) { $merged = array_merge($merged, $list); } // $merged === [1, 2, 3, 4, 5, 6];
Это очень плохая практика, потому что это убийца производительности (памяти)!
Вместо этого вы должны использовать оператор распространения (в PHP с версии 5.6!):
$lists = [ [1, 2], [3, 4], [5, 6], ]; $merged = array_merge(...$lists); // === [1, 2, 3, 4, 5, 6];
Распаковка ассоциативного массива
Что, если бы у вас был ассоциативный массив вместо этого?
$lists = [ 'key-1' => [1, 2], 'key-2' => [3, 4], 'key-3' => [5, 6], ];
В этом случае вам нужно будет распаковать его значения:
$merged = array_merge(...array_values($lists)); // === [1, 2, 3, 4, 5, 6];
В функциональном программировании это называется выравнивание списка.
Никаких циклов и проблем с производительностью.
Сведение многоуровневого массива
Что, если вы хотите сгладить такой многоуровневый массив?
$lists = [[1], 2, [[3, 4], 5], [[[]]], [[[6]]], 7, 8, []];
Или как этот, даже с парами "ключ-значение"?
$lists = [ 'key-1' => [ 1, [2], 'key-2' => [ 3, [ 'key-3' => [4, 5], ], ], ], 6, 'key-4' => [7, 8], ];
В этих случаях вы можете использовать внутреннюю стандартную библиотеку:
$merged = iterator_to_array( new RecursiveIteratorIterator( new RecursiveArrayIterator($lists) ), $use_keys = false ); // $merged === [1, 2, 3, 4, 5, 6, 7, 8];
Заключение
Обычно достаточно знать, как сгладить «двухуровневый» массив:
$flattenList = array_merge(...array_values($lists));
В противном случае вам поможет внутренняя стандартная библиотека.