Как правильно реализовать построение древа через рекурсию?

Рейтинг: 1Ответов: 1Опубликовано: 26.11.2014

Есть массив:

$arr = array(
//            id    parent_id   text
        array(1,    0,      'text_1'),
        array(4,    2,      'text_4'),
        array(8,    0,      'text_8'),
        array(3,    1,      'text_3'),
        array(10,   3,      'text_10'),
        array(5,    4,      'text_5'),
        array(7,    3,      'text_7')
        );

Как правильно реализовать построение древа через рекурсию?

function tree ($arr,$parent_id)
    {
        $tree = "<div>";
        foreach($arr as $treeA)
            {
                if($treeA[1]==$parent_id)
                {
                 $tree .= $treeA[2];
                 tree($arr,$treeA[0]);
                 }

            }
        $tree .= "</div>";
        echo $tree;
    }
tree($arr,0);

Результат неправильный, выводит:

    text_10text_7
    text_5text_6
    text_4
    text_3text_2
    text_12
    text_1text_8text_9text_11

Ответы

▲ 1Принят
function maketree(&$arr,$pid=0){//Массив передается по ссылке, чтобы мы могли сразу вытаскивать использованные компоненты. Еще можно отсортировать по parent.
    $out = array();
    foreach($arr as $n=>$row){
        if($row[1]==$pid) {//Если родитель равен запрашиваемому, такой элемент нам подходит
            $r = array('name' => $row[2],'pid'=>$row[1]);
            unset($arr[$n]);//Удаление вставленного элемента.
            $children = maketree($arr, $row[0]);// выбираем детей из массива
            if (count($children) > 0) {//если нашли больше 0 детей, создаем соответствующий ключ
                $r['children'] = $children;
            }
            $out[]=$r;
        }
    }
    return $out;
}

С выводом, думаю, справитесь. Если не задан ['children'], то детей нет.