Задать вопрос
@topuserman

Какие есть варианты получить все свойства многомерного массива?

Структура массива:

$arr = [
	[
		"ID" => 1,
		"DATA" => [...]
		"NAME" => "...",
		"SUB" => [
			[
				"ID" => 2,
				"DATA" => [...]
				"NAME" => "...",
				"SUB" => [
					...
				],
				"ID" => 3,
				"DATA" => [...]
				"NAME" => "..."
			]
		]
	],
	[
		"ID" => 10,
		"DATA" => [...]
		"NAME" => "...",
		"SUB" => [
			...
		]
	]
];


Т.е. корневые элементы массива - некие сущности, которые имеют свойства:
ID, DATA, NAME, также свойство SUB в котором дочерние элементы, такого же формата.

Задача: должна быть функция, которая на вход принимает произвольный массив подобного формата и код свойства.
Например:
$result = getProperties($arr, "NAME");
// результат = массив из всех свойств NAME

$result = getProperties($arr, "DATA");
// результат = массив из всех свойств DATA


Варианты решения:
1. рекурсия
2. итеративный алгоритм
3. ? может как-то через array_map или array_walk_recirsive и т.д. ?
  • Вопрос задан
  • 88 просмотров
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 2
function getProperties(array $haystack, string $needle): array
{
    $result = [];

    foreach ($haystack as $key => $item) {
        if ($key === $needle) {
            $result[] = $item;
        } elseif (is_array($item)) {
            $result = array_merge($result, getProperties($item, $needle));
        }
    }

    return $result;
}
Ответ написан
Комментировать
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
У вас, фактически, задано дерево. Каждая вершина - это элемент на каком-то уровне в массиве. Его свойство SUB - это дети дерева.

Вам надо получить список всех вершин, т.е. обойти дерево. Тут есть 2 стандартных решения - обход в ширину и обход в глубину. В глубину - это рекурсивная функция. В ширину, это будет итеративное решение, но нужна очередь.

Рекурсивное решение пишется легче всего, как мне кажется.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽