如何解决PHP树依赖列表仅适用于某些儿童
我正在寻找一个可以创建分层数组但仅适用于某些孩子的函数。
这个例子似乎不错: Recursive function to generate 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应该是最小的孩子,在它们之下什么也不要。
要继续,我想要的内容与链接的帖子完全相同,但是我最小的叶子应该只是数组[2,4,5]中存在的叶子的ID
我不知道有人能理解我的问题...
非常感谢
编辑:我已经更新并添加了ID = 5的示例。
解决方法
是的,您的问题很清楚。您只想从底部到顶部重新创建树,仅用于特定叶子的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,"title" => "Another Parent Page"],["id" => 5,"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"],$participatingIds);
}
}
//Initial function to build a tree from a flat category array
function 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,5 ]
*/
$ids = [];
foreach ($someIds as $id) {
collectAllParentsId($id,$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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。