PHP 树依赖列表仅适用于某些子项

我正在寻找一个可以创建分层数组但仅适用于某些孩子的函数。

这个例子似乎不错: Recursive function togenerate multiDimensional array from database result

但我想要父母只需要一些身份证。例如 :

+-------+---------------+---------------------------+

|   id  |   parent_id   |           title           |

+-------+---------------+---------------------------+

|   1   |       0       |   Parent Page             |

|   2   |       1       |   Sub Page                |

|   3   |       2       |   Sub Sub Page            |

|   4   |       0       |   Another Parent Page     |

|   5   |       1       |   Sub Page 2              |

+-------+---------------+---------------------------+

我只想要 id 2、4 和 5 的层次结构。


并返回给我这样的东西:


Array

(

    [0] => Array

        (

            [id] => 1

            [parent_id] => 0

            [title] => Parent Page

            [children] => Array

                        (

                            [0] => Array

                                (

                                    [id] => 2

                                    [parent_id] => 1

                                    [title] => Sub Page                                                    

                                ),

                            [1] => Array

                                (

                                    [id] => 5

                                    [parent_id] => 1

                                    [title] => Sub Page 2                                                     

                                )

                        )

        )

    [1] => Array

        (

            [id] => 4

            [parent_id] => 0

            [title] => Another Parent Page

        )

)

2、4 和 5 应该是最小的孩子,并且没有低于他们的孩子。


继续,我想要的与链接的帖子完全相同,但我最小的叶子应该只是数组中存在的叶子的 id [2,4,5]


不知道有没有人明白我的问题...


蛊毒传说
浏览 111回答 1
1回答

摇曳的蔷薇

是的,你的问题很清楚。您想要从下到上重新创建树,仅针对特定叶子的 id。您可以通过从初始数组中过滤掉所有不必要的类别来实现它,然后使用您之前找到的函数构建树。//Assuming you have this array with mysql result of all possible categories$mysqlRows = [    ["id" => 1, "parent_id" => 0, "title" => "Parent Page"],    ["id" => 2, "parent_id" => 1, "title" => "Sub Page"],    ["id" => 3, "parent_id" => 2, "title" => "Sub Sub Page"],    ["id" => 4, "parent_id" => 0, "title" => "Another Parent Page"],    ["id" => 5, "parent_id" => 1, "title" => "Sub Page 2"]];/* * Fill $participatingIds array with id of categories that related to our needs * Be aware that $participatingIds has & sign - it means * that it will be passed by reference */function collectAllParentsId($id, $mysqlRows, &$participatingIds){    if (!in_array($id, $participatingIds)) {        $participatingIds[] = $id;    }    if ($mysqlRows[$id]["parent_id"] !== 0) {        collectAllParentsId($mysqlRows[$id]["parent_id"], $mysqlRows, $participatingIds);    }}//Initial function to build a tree from a flat category arrayfunction buildTree(array $elements, $parentId = 0) {    $branch = array();    foreach ($elements as $element) {        if ($element['parent_id'] == $parentId) {            $children = buildTree($elements, $element['id']);            if ($children) {                $element['children'] = $children;            }            $branch[] = $element;        }    }    return $branch;}/* START *//* * Make array indexes equals to the category's "id", * so we can access category like this $mysqlRows[$category_id]*/$mysqlRows = array_column($mysqlRows, null, "id");//Array of ids for which you want create a tree$someIds = [2, 4, 5];/* * Create one flat array with all Ids that will participating in the tree * (leaf id and all of it parents id) * Order of ids is doesn't matter here * $ids will looks like this: * [ 1, 2, 4, 5 ] */$ids = [];foreach ($someIds as $id) {    collectAllParentsId($id, $mysqlRows, $ids);}//Now filter out all categories that doesn't participating in out tree$filteredRows = array_filter(    $mysqlRows,    function ($key) use ($ids) {        return (in_array($key, $ids));    },    ARRAY_FILTER_USE_KEY);//Now we have only desired categories - create the tree from it:$tree = buildTree($filteredRows);var_dump($tree);
打开App,查看更多内容
随时随地看视频慕课网APP