@Stankevich_M

Как работает функция построения дерева?

Может кто-нибудь объяснить как работает функция map_tree() ? Функция получает одномерный массив и строит из него "дерево". Прочитал материал о присвоении по ссылке (&) но не могу понять как устроен функционал в этой функции, помогите пожалуйста!
$arr = [0 => [
		'id' => 685,
		'title' => 'Комплектующие к Apple',
		'parent' => 0
	],
	1 => [
		'id' => 691,
		'title' => 'Запчасти к iPad',
		'parent' => 685
	],
	2 => [
		'id' => 692,
		'title' => 'Запчатси к iPhone',
		'parent' => 681
	]
];


function map_tree($dataset) {
	$tree = [];
	foreach($dataset as $id =>&$node) {
		if(!$node['parent']) {
			$tree[$id] = &$node;
		}else {
			$dataset[$node['parent']]['childs'][$id] = &$node;
		}
	}
	return $tree;
}


echo '<pre>';
print_r(map_tree($arr));
echo '</pre>';
  • Вопрос задан
  • 277 просмотров
Решения вопроса 1
Decadal
@Decadal
if(!$node['parent']) {
      $tree[$id] = &$node;
    }

если у текущего элемента нет предка, значит, вы помещаете текущий элемент в $tree по ссылке. То есть, изменение этого элемента в $tree повлияет на $dataset и наоборот, изменив этот элемент в dataset вы измените tree.
рекомендую заменить первую строку в фрагменте кода, который я выделил, на if(!isset($node['parent'])) {
далее:
$dataset[$node['parent']]['childs'][$id] = &$node;

если предок есть (то есть, это не рутовый элемент), вы добавляете в изначальный dataset информацию о том, что у его элемента, идентификатор которого равен предку текущего элемента, есть child, и заносите туда текущий элемент. Поскольку перед этим вы сохранили в tree элемент node по ссылке, то эта операция также изменит и структуру переменной tree.
Обратите внимание, что, убрав & из выделенного фрагмента, вы получите тот же результат, что и с ним.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
судя по распечатке массива, где-то ошибка: функция предполагает, что в неё передаётся хэш ( то есть массив, у которого ключи - значимы), а у вас приведён список ( ключи не несут информации ).
Может, поэтому и непонятен результат работы функции. $arr должен быть таким:
$arr = [685 => [
    'id' => 685,
    'title' => 'Комплектующие к Apple',
    'parent' => 0
  ],
  691 => [
    'id' => 691,
    'title' => 'Запчасти к iPad',
    'parent' => 685
  ],
  692 => [
    'id' => 692,
    'title' => 'Запчатси к iPhone',
    'parent' => 681
  ]
];

Плюс в последнем элементе подозрительное значение у ключа parent ( больше подходит 685 ).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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