gpt4 book ai didi

仅适用于某些 child 的 PHP 树依赖列表

转载 作者:行者123 更新时间:2023-12-04 03:57:29 26 4
gpt4 key购买 nike

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

这个例子看起来不错: Recursive function to generate multidimensional array from database result

但我想要 parent 只是为了一些身份证件。例如:

+-------+---------------+---------------------------+
| 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 应该是最小的 child ,下面没有任何东西。

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

不知道有没有人理解我的问题...

非常感谢

编辑:我更新并添加了 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, "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);

关于仅适用于某些 child 的 PHP 树依赖列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63613658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com