带有ul标记的PHP构建树

时间:2014-12-07 15:02:37

标签: php

我有以下php数组

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
        )

    [1] => Array
        (
            [0] => 3
        )

    [2] => Array
        (
            [0] => 4
        )

    [4] => Array
        (
            [0] => 5
        )

)

其中第一个键(0,1,2,4)是包含子项的ID。

一切都从键0开始,键0是所有其他键的父键。

我想从此数组中使用ul li标记 构建一个树 。我搜索了网站,发现了类似的主题,但后来我发现我的方法不一样了。

我试图这样做但失败了。

修改

这是我到目前为止所做的:

function PrintTree( $arr )
{
    global $names;

    echo "<ul>";
    foreach ( $arr as $key => $childrens )
    {
        if ( $key == 0 and is_array( $childrens ) )
        {
            PrintTree( $childrens );
            continue;
        }

        if ( is_array( $childrens ) )
        {
            echo "<li><a href=\"#\">" . $names[$key] . "</a>";
            PrintTree( $childrens );
            echo "</li>";
        }
        else
        {
            echo "<li><a href=\"#\">" . $names[$childrens] . "</a></li>";
        }
    }
    echo "</ul>";
}

上面的代码失败并产生了这个:

Root 
      Item 1
      Item 2
   Item 1
      Item 3
   Item 2
      Item 4
   Item 4
      Item 5

但正确的树应该是:

Root 
     Item 1
         Item 3
     Item 2
         Item 4
             Item 5

谢谢

1 个答案:

答案 0 :(得分:2)

也许像这个代码片段应该有效:

$foo = [
    0 => [1,2],
    1 => [3],
    2 => [4],
    4 => [5],
];

function track($array, $index = 0) {
    $out = '<ul>';
    if (isset($array[$index]) && is_array($array[$index])) {
        foreach($array[$index] as $track) {
            $out .= '<li>'.$track;
            $out .= track($array, $track);
            $out .= '</li>';
        }
    }
    $out .= '</ul>';
    return $out;
}

echo track($foo);