PHP

Как преобразовать многомерный массив в PHP в одномерный (4 способа)

В 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() эффективно справляются с определенными задачами.

To top