Как из многомерного массива сделать одномерный php
Перейти к содержимому

Как из многомерного массива сделать одномерный php

  • автор:

Создаем одномерный массив из многомерного

Задача, которой я хотел бы посвятить эту статью, у некоторых не так часто встречается или пока ещё вовсе не попадалась — создание одномерного массива из многомерного. Однако, на форумах время от времени эта тема поднимается, а кроме того, за последние два месяца, мне приходилось несколько раз решать нестандартные ситуации, связанные с этим вопросом.

Всё достаточно просто, если исходный массив у нас двумерный. Возьмём, для примера, такой:

В самом обычном цикле, делаем слияние каждого из вложенных массивов с результирующим массивом (изначально пустым), используя функцию array_merge() и записывая результат слияния в этот же конечный массив:

Можно конечно и поизвращаться, но больше для расширения кругозора, чем для реальной практики в данной задаче. Будем использовать две функций: array_map() — применяет callback-функцию к каждому элементу массива и функцию array_merge(), которую рассматривали выше.

Немного расшифрую: в качестве callback-функции, мы используем анонимную функцию, которая получает поочерёдно каждый из вложенных массивов в переменную "$a" и сливает с массивом "$arrOut", который в итоге и будет содержать все значения исходного массива, но уже как одномерным. Так как внутри callback-функции массив "$arrOut" будет не виден (если только он не объявлен глобальным), мы используем ключевое слово use, которое позволяет использовать внешние переменные. Но передаём массив не как значение, а как "ссылку", поставив перед переменной символ амперсанда "&". Если бы мы этого не сделали, то каждый раз, мы получали бы пустой массив "$arrOut", который сливали с текущим "$a".
Для новичков всё это пока малопонятно и, пытаясь адаптировать код под свои нужды, могут наделать ошибок. Не пугайтесь — есть решение «в пару строк»;) Используем функцию call_user_func_array(), которая, по сути, сделает всё то, что мы делали во втором примере, но, так сказать, одним махом.

В результате всех вышеупомянутых вариантов, мы получим массив такого вида:

Хочу отметить, что в случае, если вложенные массивы являются ассоциативными, то при совпадении ключей, последующий элемент будет перезаписывать предыдущий с таким же ключом. Чтобы избежать такой неувязочки и получить все значения, мы немного доработаем наш код функцией array_values():

Остаётся выяснить, какой из трёх вариантов работает быстрее. Я сгенерировал массив, состоящий из сотни вложенных массивов, в каждом из которых по десять элементов и вот средние результаты, которые говорят сами за себя:

Способ секунд
Цикл + array_merge 0.0109
array_map + array_merge 0.0170
call_user_func_array 0.0009

С двумерными массивами немного разобрались, теперь перейдём к более сложной задаче — трехмерные (и более) массивы или многоуровневые массивы с неизвестной вложенностью. И первое решение, которое напрашивается — это использование рекурсии.

Вполне нормальный способ, который, на мой взгляд, не требует каких-то подробных разъяснений и хорошо справляется со своей задачей. Многие, даже не задумываясь, именно его бы и применили. Но я хочу показать, как это же можно сделать буквально парой строк кода, используя «итераторы» из стандартной библиотеки PHP (SPL):

Вот и всё! И результат будет, как и в первом случае такой:

Ну, и как в первом случае, показываю среднюю скорость выполнения двух вариантов:

Способ секунд
Рекурсия 0.2558
Классы итераторов 0.0346

Разница в скорости — более, чем в семь раз и кода меньше примерно во столько же! Дальнейшие комментарии излишни. 😉

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

Как из многомерного массива сделать одномерный php

Преобразование многомерного массива в одномерный на PHP

Как гласит японская мудрость: «Даже если меч понадобится один раз в жизни, носить его нужно всегда». Следующий трюк как раз из этой серии. А именно, преобразование многомерного массива в одномерный.

Делается все при помощи стандартного класса RecursiveIteratorIterator, который берет на себя извлечение данных из многомерного массива, и функции iterator_to_array, которая преобразует эти данные в одномерный массив. Код будет выглядеть следующим образом:

  1. // Исходный многомерный массив
  2. $multi_array =array(
  3. array( ‘first’ , 1 , 2 , 3 ),
  4. ‘A’ =>array(
  5. ‘ZYXEL’ =>array( ‘banana’ , ‘apple’ , 7 , ‘gnome’ ),
  6. 7 =>array( ‘a’ , ‘b’ , ‘c’ ),
  7. ‘ROBOTIX’ =>array( ‘2400’ , ‘3200’ , ‘8000’ ),
  8. ),
  9. ‘INTEL’ => array(
  10. 0 =>array( 8 , ‘AMD’ ),
  11. 1 =>array(
  12. ‘groups’ => array(
  13. array( ‘metallica’ , ‘accept’ , ‘kiss’ ),
  14. ‘kurt’
  15. )
  16. )
  17. )
  18. );
  19. $iterator =new RecursiveIteratorIterator (new RecursiveArrayIterator ( $multi_array ));
  20. $one_array = iterator_to_array ( $iterator , false );
  21. print_r ( $one_array );

На входе многомерный массив с совершенно разнобойными элементами и ключами. На выходе получаем одномерный массив, включающий в себя все элементы многомерного массива.

Array
(
[0] => first
[1] => 1
[2] => 2
[3] => 3
[4] => banana
[5] => apple
[6] => 7
[7] => gnome
[8] => a
[9] => b
[10] => c
[11] => 2400
[12] => 3200
[13] => 8000
[14] => 8
[15] => AMD
[16] => metallica
[17] => accept
[18] => kiss
[19] => kurt
)

На моей многолетней практике такая задача возникала всего один раз. Если вам когда-нибудь пригодится мое решение, то буду только рад.

Как из многомерного массива сделать одномерный php

Программирование на C++ в Unreal Engine 5

Программирование на C++ в Unreal Engine 5

Данный курс научит Вас созданию игр на C++ в Unreal Engine 5. Курс состоит из 12 разделов, в которых Вас ждёт теория и практика. Причём, в качестве практики будет создан весьма крупный проект объёмом свыше 5000 строк качественного кода, который уже на практике познакомит Вас с принципами создания игр на C++ в Unreal Engine 5.

Параллельно с курсом Вы также будете получать домашние задания, результатом которых станет, в том числе, полноценная серьёзная работа для портфолио.

Помимо самого курса Вас ждёт ещё и очень ценный Бонус: «Тестирование Unreal-проектов на Python», в рамках которого Вы научитесь писать очень полезные тесты для тестирования самых разных аспектов разработки игр.

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Массивы в PHP (array in php)

Admin 09.07.2018 , обновлено: 17.04.2020 PHP

Примеры формирования массивов в PHP.

1. Вывод массива на экран

Для проверки данных в массиве можно использовать два варианта. Первый:

Второй вариант, который я предпочитаю больше, чтобы показать массив в удобочитаемом виде:

Примечание: p re — исправить на pre

2. Разделение простого массива на ключ-значение

Разделение простого массива на два параметра: «ключ» и «значение», которые потом можно использовать:

3. Удаление данных из массива

1. Перебираем массив, который называется $names, разделив данные на ключ и значение. В данном примере, предположим, ключ это id, а значение не важно.

2. Ищем (перебираем) в массиве $games список всех ключей. Если в первом массиве ($names) такого ключа нет, то из этого же массива ($names) мы его удаляем.

Таким образом, мы уменьшили массив $names. Убрали из него порядковые номера id, которых не было в массиве $games.

Если unset вызывает fatal следует проверить, а не из объекта вы пытаетесь удалить массив? Если это объект, то удаление будет иное:

4. Соединяем два массива

Имеем 2 массива.

Если в первом массиве есть значение, которое указано в ключе (ключ имеет название name) второго массива, то первому массиву присваиваем это значение.

foreach ($arr2 as $k => $v) <

if (isset($arr1[$k])) $arr2[$k][‘name’] = $arr1[$k];

5. Соединяем массивы по уникальным ключам — переносим значение в ключ

Описание

Нужно сравнить ключи первого массива с ключами второго массива. При совпадении данных, перенести значение из первого массива во второй.

Результат

6. Соединяем массивы по уникальным ключам — переносим значение в значение

Описание

Те же массивы, но нам нужно заменить значение ключей, а не сами ключи.

Рузультат

7. Переделка большого многомерного массива

Переделаем большой многомерный массив $data в новый массив. В котором одно из значений переместим в начало массива, а другие значения сделаем его подмассивами.

function our_best_array() <
foreach ($data as $key => &$value) <
foreach ($value as $k) <

foreach ($k as $inside) <
foreach ($inside as $number) <
$new_array[$k[0]][‘name’] = $k[0];
$new_array[$k[0]][$k[1]][‘title’] = $k[1];
$new_array[$k[0]][$k[1]][$k[6]][] = $number[0];
>
>
>
>

Разбор участка кода:

Мы создаем новый массив с названием $new_array. У него будет главный ключ $k[0], затем будет подмассив состоящий из данных $k[1], а него в свою очередь будет подмассив $k[6], который содержит все данные последнего цикла (самой последней вложенности старого массива) $number[0].

8. Как отсортировать массив

Сортировка массива по ключу. Сначала осуществляем перебор массива с помощью foreach, а затем используя функцию ksort сортируем по ключам. Стоит обратить внимание на флаг SORT_NATURAL, это позволяет сортировать массив по-человечески, когда после единицы всегда 2, а не 11.

9. Оставляем только уникальные данные в массиве

Перебираем многомерный массив $data.

foreach ($data as $k) <
$games[] = $k;

А затем формируем новый массив, оставляя только уникальные значения.

10. Функция возврата максимальных значений в многомерном массиве данных

Чтобы найти максимальное значение в одномерном массиве достаточно использовать функцию:

Но это не получится сделать, если массив многомерный. Для сортировки многомерного массива по одному из ключей одного из массивов можно воспользоваться другой функцией. Для начала дойти до нужной итерации и внутри неё уже использовать следующую функцию:

11. Функция reset

Позволяет исключить циклы foreach внутри массива, чтобы добраться до тех массивов, с которых уже можно начать делать перебор.

12. Многомерный массив превращаем в одномерный

Берем из многомерного массива ключ и значение и делаем одномерный:
https://ploshadka.net/array-key-combination/

Читайте также

У сайта нет цели самоокупаться, поэтому на сайте нет рекламы. Но если вам пригодилась информация, можете лайкнуть страницу, оставить комментарий или отправить мне подарок на чашечку кофе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *