Задать вопрос
@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 и т.д. ?
  • Вопрос задан
  • 81 просмотр
Подписаться 1 Простой 1 комментарий
Решения вопроса 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 стандартных решения - обход в ширину и обход в глубину. В глубину - это рекурсивная функция. В ширину, это будет итеративное решение, но нужна очередь.

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

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

Похожие вопросы