二维数组中的嵌套列表

时间:2018-12-01 17:45:56

标签: php html list recursion nested

我想从二维数组中创建HTML(带有ul和li)的嵌套列表。

该数组如下所示:

myArray["1"]["name"] -> Apple
myArray["1"]["parent"] -> 2
myArray["2"]["name"] -> Fruits
myArray["2"]["parent"] -> 3
myArray["3"]["name"] -> Food
myArray["3"]["parent"] -> (empty)
myArray["4"]["name"] -> Water
myArray["4"]["parent"] -> 5
myArray["5"]["name"] -> Drinks
myArray["5"]["parent"] -> (empty)
myArray["6"]["name"] -> Milk
myArray["6"]["parent"] -> 5

现在我想找到所有这些关系(也包括更多的层),并使用HTML列表元素来显示它们:

    $allObjects = db_getAll();

    function r($parent, $arrayAllObjects){

        foreach ($arrayAllObjects as $object) {
            if ($object["parent"]==$parent) {
                return ("<ul>".$object["name"]."<li>". r($object["ID"], $arrayAllObjects)."</li></ul>");
            }
        }
    }


    echo r("0", $allObjects);

开始良好,第一个“分支/手臂”完美显示,但之后(末尾的第一个叶子)停止:(

当前结果:

 -Food
  -Fruits
   -Apple

缺少:

 -Drinks
  -Water
  -Milk
 -Example
  -Test
   -Test
   -...
 -...

我忘记了什么?

非常感谢您!

1 个答案:

答案 0 :(得分:0)

问题在于,在基础层处理完第一项后,您就可以在return循环内foreach进行循环操作,这意味着它不会再涉及其他任何项。

相反,您需要构建所有输出并将其从函数末尾返回...

function extractLayer($parent, $arrayAllObjects){
    $output = "";
    foreach ($arrayAllObjects as $object) {
        if ($object["parent"]==$parent) {
            $subLayer = extractLayer($object["ID"], $arrayAllObjects);
            if ( !empty($subLayer) )    {
                $output .="<ul>".$object["name"].$subLayer."</ul>";
            }
            else    {
                $output .= "<li>".$object["name"]."</li>";
            }
        }
    }
    return $output;
}

echo extractLayer("0", $allObjects);

我还更改了函数名,因为r不明显。

只需对此进行更新,因为即使没有子层,每个叶子也在构建自己的列表。因此,这会检查子图层,如果没有,则将其放入<li>标签中。