Агрегат SQL-запроса может не отображаться в предложении WHERE

Некоторое очень простое, общее построение дерева:

function buildTree(array $elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

$tree = buildTree($rows);

Алгоритм довольно прост:

  1. Возьмите массив всех элементов и идентификатор текущего родителя (первоначально 0 / nothing / null / whatever).
  2. Прокрутите все элементы.
  3. Если parent_id элемента совпадает с текущим родительским идентификатором, который вы получили 1., элемент является дочерним элементом родителя. Поместите его в список текущих детей (здесь: $branch).
  4. Вызовите функцию рекурсивно с идентификатором элемента, который вы только что идентифицировали в 3., то есть найдите всех детей этого элемента и добавьте их как children.
  5. Верните список найденных детей.

Другими словами, одно выполнение этой функции возвращает список элементов, которые являются дочерними данного родительского идентификатора. Вызовите его с помощью buildTree($myArray, 1), он вернет список элементов, у которых есть родительский идентификатор 1. Первоначально эта функция вызывается с родительским идентификатором, равным 0, поэтому возвращаются элементы без родительского идентификатора, которые являются корневыми узлами. Функция вызывает себя рекурсивно, чтобы найти детей детей.

16
задан Johan 23 August 2011 в 20:42
поделиться