摇曳的蔷薇
是的,你的问题很清楚。您想要从下到上重新创建树,仅针对特定叶子的 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);