Построение дерева из массива

blblago

Новичок
PHP:
/**
* Построение дерева из массива
**/

$category = [
1 => ['parent_id' => 0, 'name' => 'Один'],
2 => ['parent_id' => 1, 'name' => 'Два'],
3 => ['parent_id' => 2, 'name' => 'Три'],
4 => ['parent_id' => 3, 'name' => 'Четыри'],
];

    foreach ($category as $id => &$value) {

    if ($value['parent_id'] == 0) {
        $view[$id] = &$value;
    } else {
        $category[$value['parent_id']]['childs'][$id] = &$value;
    }
}

# Оттенение результата работы
    echo "<pre>";
    print_r($view);
    echo "<pre>";

Уважаемые форумчане, и просто добрые люди, помогите пожалуйста разобраться что происходит в цикле
PHP:
foreach ($dataset as $id => &$node)
а самое главное в строке
PHP:
$category[$value['parent_id']]['childs'][$id] = &$value;
Если не сложно на пальцах объяснить что происходит в цикле на каждой итерации и каким образом появляется массив потомков ['childs']

Простое объяснение что такое ссылки на сайте офф документации php не как не помогает мне понять работу данного кода.

$a = 10;

$b = &$a;

$b = 15;

Заранее очень благодарен.
 

WMix

герр M:)ller
Партнер клуба
Там все просто, &$value это ссылка на элемент в $category, который ($category) меняется добавляя детей. Те. Мы запомнили только корень, (точнее ссылку на него) а а else блоке накидали в него ссылки на детей, которые наполняются в этом же блоке ссылками на своих детей. Внимательно присмотрись в какой элемент добавляются &$value в else блоке
 

fixxxer

К.О.
Партнер клуба
foreach ($dataset as $id => &$node)
массив потомков ['childs']
В оригинале, где $dataset и $node, слово "children" написано правильно. Нет такого слова "childs". :)

Простое объяснение что такое ссылки на сайте офф документации php не как не помогает мне понять работу данного кода.
Главное, чтобы понял, что такое ссылки.

Чтобы разобраться, посмотри в отладчике, как меняется исходный массив после каждой итерации цикла, это лучше любых словесных объяснений.

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

PHP:
function build_tree(array $dataset)
{
    foreach ($dataset as $id => $node) {
        $parent_node_id = $node['parent_id'];

        if ($parent_node_id == 0) {
            if (isset($root_node_id)) {
                throw new Exception("There can be only one root node");
            }
            $root_node_id = $id;
        } else {
            if (!isset($dataset[$parent_node_id])) {
                throw new Exception("Parent node not found by id: $parent_node_id");
            }
            $dataset[$parent_node_id]['children'][$id] = &$dataset[$id];
        }
    }

    if (!isset($root_node_id))
        throw new Exception("Root node not found");

    return $dataset[$root_node_id];
}

$category = [
    1 => ['parent_id' => 0, 'name' => 'Один'],
    2 => ['parent_id' => 1, 'name' => 'Два'],
    3 => ['parent_id' => 2, 'name' => 'Три'],
    4 => ['parent_id' => 3, 'name' => 'Четыри'],
];

$tree = build_tree($category);
print_r($tree);
 
Сверху