使用PHP foreach组织页面树

时间:2018-03-30 11:17:20

标签: php

我对PHP相对缺乏经验。基本上,我有一些页面数据,如下所示:

Data

我希望使用foreach循环将子页面组织成Subpages数组,该数组将是父页面的属性。以下是我到目前为止所写的内容,但只取得了部分成功。我想知道我是否沿着正确的路线或者如果使用库或更好的逻辑它们是更有效的方式。任何帮助将不胜感激!

PHP($ nav是数据显示在图片中)

function renderNav($nav){

    $data = $nav;

    foreach ($data as &$page) {
        $page['Subpages'] = array_filter($data, function($i) use ($page){ return $i['ParentId'] == $page['Id']; });
        if(sizeof($page['Subpages'])==0){
            $page['Subpages'] = array();
        };
        usort($page['Subpages'], function($a, $b){ return $a['Order'] - $b['Order']; });
    };

    $filtered = array();
    foreach ($data as &$page) {
        if($page['ParentId'] == 0 || $page['ParentId'] == null){
            array_push($filtered, $page);
        }
    };
}

1 个答案:

答案 0 :(得分:1)

我无法阻止并为该任务编写一个简单的递归函数:

<?php
// demo input
$nav = [array("id"=>21, "parentId"=>20, "Order"=>0),
        array("id"=>20, "parentId"=>17, "Order"=>0),
        array("id"=>18, "parentId"=>17, "Order"=>1),
        array("id"=>19, "parentId"=>18, "Order"=>0),
        array("id"=>17, "parentId"=>0, "Order"=>0),
        array("id"=>16, "parentId"=>18, "Order"=>1)


       ];

// the actual recursive function
function walkNav($a, $parentId=0) {
    $parents = array_values(array_filter($a, function($sub) use($parentId) { return $sub['parentId'] == $parentId; }));
    foreach($parents as &$parent) {
        $parent['children'] = walkNav($a, $parent['id']);   
    }
    return $parents;
}

// usage
$result = walkNav($nav);

// output
echo "<pre>";
//var_dump($result);
echo json_encode($result, JSON_PRETTY_PRINT);
echo "</pre>";

您现在可以使用该数组($result)来构建导航! 当输入变大时,此功能将变得非常昂贵。我没有在这里进行优化(在递归中取消设置使用的项目),因为在你的情况下不会有1000个项目。

结果如下:

[
    {
        "id": 17,
        "parentId": 0,
        "Order": 0,
        "children": [
            {
                "id": 20,
                "parentId": 17,
                "Order": 0,
                "children": [
                    {
                        "id": 21,
                        "parentId": 20,
                        "Order": 0,
                        "children": []
                    }
                ]
            },
            {
                "id": 18,
                "parentId": 17,
                "Order": 1,
                "children": [
                    {
                        "id": 19,
                        "parentId": 18,
                        "Order": 0,
                        "children": []
                    },
                    {
                        "id": 16,
                        "parentId": 18,
                        "Order": 1,
                        "children": []
                    }
                ]
            }
        ]
    }
]