Рекурсийный параментЧидтертертор - как рекурсиверекториятертертертер

StackOverflow https://stackoverflow.com/questions/2738278

Вопрос

Существуют тонны примеров использования рекурсистратора, чтобы сгладить структуру дерева. Но как насчет использования его, чтобы взорвать структуру деревьев?

Есть ли элегантный способ использовать это или какую-то другую библиотеку SPL для рекурсивно построить дерево (прочитать: превратить плоский массив в массив произвольной глубины), учитывая таблицу, как это:

SELECT id, parent_id, name FROM my_tree

РЕДАКТИРОВАТЬ:Вы знаете, как вы можете сделать это с каталогами?

$it = new RecursiveDirectoryIterator("/var/www/images");
foreach(new RecursiveIteratorIterator($it) as $file) {
    echo $file . PHP_EOL;
}

.. что если бы вы могли сделать что-то вроде этого:

$it = new RecursiveParentChildIterator($result_array);
foreach(new RecursiveIteratorIterator($it) as $group) {
    echo $group->name . PHP_EOL;
    // this would contain all of the children of this group, recursively
    $children = $group->getChildren();
}

: End edit.

Это было полезно?

Решение

Хотя не SPL, но вы можете использовать ссылки (&) Создайте дерево с родным PHP:

// untested
$nodeList = array();
$tree     = array();
foreach ($result as $row) {
    $nodeList[$row['id']] = array_merge($row, array('children' => array()));
}
foreach ($nodeList as $nodeId => &$node) {
    if (!$node['parent_id'] || !array_key_exists($node['parent_id'], $nodeList)) {
        $tree[] = &$node;
    } else {
        $nodeList[$node['parent_id']]['children'][] = &$node;
    }
}
unset($node);
unset($nodeList);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top