更新时间:2023-11-07 09:51:46
说明可以作为内联找到注释。此功能提供您确切的所需输出。还请注意我为设置 $ resultset
而重写的查询。
Explanations can be found as inline comments. This function provides your exact desired output. Also pay attention to the query that I've rewritten to set up $resultset
.
代码:(演示)
function findParent(&$array,$parentid=0,$childarray=[]){ // make $array modifiable
foreach($array as $i=>&$row){ // make $row modifiable
if($parentid){ // if not zero
if($row['id']==$parentid){ // found parent
$row['nodes'][]=$childarray; // append child to parent's nodes subarray
}elseif(isset($row['nodes'])){ // go down rabbit hole looking for parent
findParent($row['nodes'],$parentid,$childarray); // look deeper for parent while preserving the initial parent_id and row
} // else continue;
}elseif($row['parent_id']){ // child requires adoption
unset($array[$i]); // remove child from level because it will be store elsewhere and won't be its own parent (reduce iterations in next loop & avoid infinite recursion)
findParent($array,$row['parent_id'],$row); // look for parent using parent_id while carrying the entire row as the childarray
} // else continue;
}
return $array; // return the modified array
}
// $db->query('SELECT id,name_a AS name,parent_id FROM accounts_tree ORDER BY id');
// for($resultset=[]; $row=$res->fetch_assoc(); $resultset[]=$row); // inspired by: http://php.net/manual/en/mysqli-result.fetch-assoc.php#112924
$resultset=[
['id'=>1,'name'=>'folder 1','parent_id'=>0],
['id'=>2,'name'=>'folder 2','parent_id'=>0],
['id'=>3,'name'=>'sub 1-1','parent_id'=>1],
['id'=>4,'name'=>'sub 2-1','parent_id'=>2],
['id'=>5,'name'=>'Sub 1-1-1','parent_id'=>3],
['id'=>6,'name'=>'folder 3','parent_id'=>0],
['id'=>7,'name'=>'sub 1-1-1-1','parent_id'=>5]
];
print_r(findParent($resultset));
输出:
Array
(
[0] => Array
(
[id] => 1
[name] => folder 1
[parent_id] => 0
[nodes] => Array
(
[0] => Array
(
[id] => 3
[name] => sub 1-1
[parent_id] => 1
[nodes] => Array
(
[0] => Array
(
[id] => 5
[name] => Sub 1-1-1
[parent_id] => 3
[nodes] => Array
(
[0] => Array
(
[id] => 7
[name] => sub 1-1-1-1
[parent_id] => 5
)
)
)
)
)
)
)
[1] => Array
(
[id] => 2
[name] => folder 2
[parent_id] => 0
[nodes] => Array
(
[0] => Array
(
[id] => 4
[name] => sub 2-1
[parent_id] => 2
)
)
)
[5] => Array
(
[id] => 6
[name] => folder 3
[parent_id] => 0
)
)