如何建立" ul li"从这个数组列出?

时间:2014-08-30 08:38:30

标签: php recursion tree

我的数据包含以下结构:

$persons = array(
    array($id, $name, $parent),
    array(2, 'John Smith', 0),
    array(3, 'Steve Martin', 2),
    array(4, 'Peter Griffin', 3),
    array(5, 'Cinder Ella', 0)
);

我希望得到这样一棵树:

<ul>
    <li>John Smith</li>
    <ul>
        <li>Steve Martin</li>
        <ul>
            <li>Peter Griffin</li>
        </ul>
    </ul>
    <li>Cinder Ella</li>
</ul>

可能这和1-2-3一样容易,但我已经尝试过一切都没有成功......

2 个答案:

答案 0 :(得分:1)

这是一个解决方案:

<?php

$persons = array(
array(2, 'John Smith', 0),
array(3, 'Steve Martin', 2),
array(4, 'Peter Griffin', 3),
array(5, 'Cinder Ella', 0)
);

echo "<ul>";
printChildren($persons,0);
echo '</ul>';

function printChildren($arr,$id){
foreach($arr as $subvalue)
        if($subvalue[2] == $id){
        echo '<li>'.$subvalue[1].'</li>';
    if(countChildren($arr,$subvalue[0])>0){
        echo '<ul>';
        printChildren($arr,$subvalue[0]);
        echo '</ul>';
    }
}
}
function countChildren($arr,$id){
$i=0;
foreach($arr as $value){
if($value[2] == $id) $i++;
}
return $i;
}
?>

答案 1 :(得分:0)

    function getChild($searchkey,$arr,&$doneArr){
                    $doneArr[] = $searchkey;
                    foreach($arr as $valArr){
                            if($key = array_search($searchkey,$valArr)){
                                    $id = $valArr[0];
                                    $name = $valArr[1];
                                    $parent = $valArr[2];
                                    if(!in_array($id,$doneArr)){
                                            $html = '<ul>';
                                            $html .= '<li>'.$name.'</li>';
                                            $html .= getChild($id,$arr,$doneArr); // used to get recursively all childs
                                            $html .= '</ul>';
                                    }
                            }
                    }
                    return $html;
            }
            $html = '<ul>';
            $cnt = sizeof($persons);
            $doneArr = Array(); // used to maintain processed items.
            for($i=0;$i<$cnt;$i++){
                    $id = $persons[$i][0];
                    $name = $persons[$i][1];
                    $parent = $persons[$i][2];
                    if(empty($parent)){
                            $html .= '<li>'.$name.'</li>';
                    }
                    $html .= getChild($id,$persons,$doneArr);
            }

            $html .= '</ul>';
            echo $html;
            unset($doneArr);