虽然您没有付出任何努力来解决您的问题,但我会回答这个问题,因为如果您不熟悉某些概念,这是一项艰巨的任务。我也理解您的问题并不是指“动态”,因为它没有硬编码。
首先,最终产品与您展示的不完全一样,但您如何设置预期的输出有点多余。根据定义,另一个数组下的填充数组将是子数组(“childs”),因此无需将它们存储在名为“childs”的子数组中。
要创建这个数组,您需要能够创建一个数组,然后还要遍历您正在制作的同一个数组。您必须小心不要让孩子成为孤儿,这意味着您有一个 id_parent 值,但在您的主数组中没有对应的 id。如果没有额外的脚本,它将不会显示在菜单中。
我已注明,以便观众可以了解正在发生的事情,而不是盲目地复制和粘贴。最后一点,我并没有真正利用 PHP 的面向对象递归数组迭代器(或者它是其他迭代器类),所以你应该研究这些。你也许能够更有效地完成同样的事情:
# Main array with parents/children
$array = array(
array(
'id'=>1,
'id_parent'=>0
),
array(
'id'=>2,
'id_parent'=>0
),
array(
'id'=>3,
'id_parent'=>0
),
array(
'id'=>4,
'id_parent'=>0
),
array(
'id'=>5,
'id_parent'=>2
),
array(
'id'=>6,
'id_parent'=>2
),
array(
'id'=>7,
'id_parent'=>3
),
array(
'id'=>8,
'id_parent'=>7
),
array(
'id'=>9,
'id_parent'=>8
)
);
/*
** @description This function is a recursive iterator, meaning it will
** traverse the current array and all children
** @param $curr [string|int] This is the current id value being ready to place
** @param $parent [string|int] This is the current parent id being searched
** @param $arr [array] This is the array that is being built for the menu structure
** @param $array [array] This is the array pool of ids and parent ids. We are going to pass by reference
** to update this array as we go to fix chicken-before-the-egg scenarios
** @param $rKey [int] This is the current key being iterated on in the main array pool
*/
function recurse($curr,$parent,$arr,&$array,$rKey)
{
# Loop through our menu array to try and match parents
foreach($arr as $key => $value) {
# If there is a match
if($parent == $key) {
# Remove the key/value pair from main array
unset($array[$rKey]);
# Add the id to our menu array
$arr[$key][$curr] = array();
}
# If there is no immediate parent match
else {
# If the value is an array, try and now look through it for parent, else just continue
$arr[$key] = (is_array($value))? recurse($curr,$parent,$value,$array,$rKey) : $value;
}
}
# Send back this current array
return $arr;
}
/*
** @description This function takes your pool of ids and loops through them, sorting the menu items
*/
function getMenuArray($array)
{
# This is the final storage array
$arr = array();
# First count to see how many are available
$count = count($array);
# Start looping
for($i=0; $i<$count; $i++) {
$row = $array[$i];
# If there are no parents, the just assign base menu
if(empty($row['id_parent'])) {
$arr[$row['id']] = array();
# Remove this key/value pair from main array since it's been used
unset($array[$i]);
}
else {
# Recurse what we currently have stored for the menu
$new = recurse($row['id'],$row['id_parent'],$arr,$array,$i);
# If the recurse function didn't find it's parent
if(isset($array[$i])) {
# add it to the back of the array
$array[] = $row;
# Remove the current array
unset($array[$i]);
# Recount how many are left to iterate through
$count = count($array);
}
# If the parent was found
else
# Assign the $new array
$arr = $new;
}
}
# Return the array
return $arr;
}
print_r(getMenuArray($array));
给你:
Array
(
[1] => Array
(
)
[2] => Array
(
[5] => Array
(
)
[6] => Array
(
)
)
[3] => Array
(
[7] => Array
(
[8] => Array
(
[9] => Array
(
)
)
)
)
[4] => Array
(
)
)