В PHP не существует встроенной функции для выравнивания многомерного массива, но выполнить это действие в PHP довольно просто.
Обычно мы приводим к одному уровню массивы данных, полученные из базы данных или API. В реальной практике мы часто стремимся исключить определенные поля из каждой строки данных для их отображения в представлениях.
1. Преобразование двумерных массивов в PHP в одномерные
При наличии двумерного массива вы можете преобразить его в одномерный, объединив его элементы и передав их в функцию array_merge()
.
<?php
// Each array has two Apple devices in each category (iPads, phones, and laptops)
$products = [
['iPad Air', 'iPad pro'],
['iPhone 13', 'iPhone 13 mini'],
['MacBook Air', 'MacBook Pro']
];
// Flatten the array
$result = array_merge(...$products);
print_r($result);
И вот что мы получим:
Array
(
[0] => iPad Air
[1] => iPad pro
[2] => iPhone 13
[3] => iPhone 13 mini
[4] => MacBook Air
[5] => MacBook Pro
)
В более ранних версиях PHP до 8.1, при наличии строковых ключей в массиве $products
, вам нужно сначала извлечь значения с помощью array_values()
:
<?php
// ...
$result = array_merge(...array_values($products));
Для более ранних версий PHP, предшествующих 7.4: в случае пустого массива $products
, метод array_merge()
будет вызван без аргументов. Это вызовет ошибку. Для предотвращения ошибки, присоедините к аргументам array_merge()
пустой массив []:
<?php
// ...
$results = array_merge([], ...$products);
Функциональность распаковки аргументов поддерживается с версии PHP 5.6 и выше.
В PHP 8.1 и выше, распаковка внешнего массива с использованием строковых ключей (ассоциативных массивов) стала возможна без применения функции array_values()
.
2.Получение набора определенных пар ключ/значение из массива.
При наличии массива, содержащего в себе другие массивы (двумерный), и желании извлечь определенный ключ (например, имя) из каждого вложенного массива для создания массива имен, вы можете воспользоваться функцией array_column()
.
Представьте себе, что вы получили данные клиентов из базы данных и они отображаются как двумерный массив. Сейчас вы планируете сформировать массив, включающий в себя имена каждого человека.
Давайте посмотрим, как это реализуется:
<?php
$records = array(
array(
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe',
),
array(
'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith',
),
array(
'id' => 5342,
'first_name' => 'Jane',
'last_name' => 'Jones',
),
array(
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe',
)
);
$first_names = array_column($records, 'first_name');
print_r($first_names);
Результат будет следующим:
Array
(
[0] => John
[1] => Sally
[2] => Jane
[3] => Peter
)
Заметьте: в случае наличия элементов с одинаковыми ключами, первый элемент будет заменен вторым.
4.Преобразование многомерного массива в PHP с применением рекурсии
Если требуется более гибкий контроль над процессом приведения к одному уровню, вы можете легко написать собственную рекурсивную функцию.
Давайте рассмотрим, как это можно сделать:
<?php
$data = [
'name' => 'James',
'contact' => [
'phone' => [
'work_phone' => '000',
'home_phone' => '111'
],
'emails' => 'james@test',
]
];
function flatten($array) {
$results = [];
foreach ($array as $key => $value) {
if (is_array($value) && ! empty($value)) {
$results = array_merge($results, flatten($value));
} else {
$results[$key] = $value;
}
}
return $results;
}
$results = [];
$results = flatten($data);
print_r($results);
В представленном коде функция flatten
получает на вход массив PHP и итерируется через все элементы с использованием цикла foreach()
.
При каждом проходе мы проверяем, является ли текущий элемент массивом и не пустым.
При наличии непустого массива мы рекурсивно вызываем функцию flatten()
с текущим элементом в качестве аргумента.
Если текущий элемент не является массивом, мы добавляем его в $results
.
В общем, функция рекурсивно вызывается до тех пор, пока проходит все немассивные элементы (достигая самых глубоких вложенностей) и добавляет их в массив $results
.
И это выведет:
Array
(
[name] => James
[work_phone] => 000
[home_phone] => 111
[emails] => james@test
)
Подведение итогов
Как правило, мы приводим в порядок многомерные массивы, которые получаем из различных источников данных, таких как база данных или API. Рекурсивный метод часто является самым естественным способом приведения массивов к общему уровню. Тем не менее, array_walk_recursive()
и array_column()
эффективно справляются с определенными задачами.