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

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

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

Войти через центр авторизации
Похожие вопросы