1 回答
TA贡献1793条经验 获得超6个赞
是的,你的问题很清楚。您想要从下到上重新创建树,仅针对特定叶子的 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 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, 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);
- 1 回答
- 0 关注
- 92 浏览
添加回答
举报