我想创建遵循以下格式的数组,以便在PHP中创建动态菜单。
$array = [
['id'=>1, 'childs'=>[]],
['id'=>2, 'childs'=>[
['id'=>5, 'childs'=>[]],
['id'=>6, 'childs'=>[]]
]],
['id'=>3, 'childs'=>[
['id'=>7, 'childs'=>[
['id'=>8,'childs'=>[
['id'=>10,'childs'=>[]]
]]
]]
]],
['id'=>4, 'childs'=>[]],
];
SQL中的数据
id id_parent
1 0
2 0
3 0
4 0
5 2
6 2
7 3
8 7
9 8
答案 0 :(得分:1)
虽然你没有努力解决你的问题,但我会回答这个问题,因为如果你不熟悉某些概念,这是一项艰巨的任务。我也理解你的问题并不意味着" dynamic" ,因为它不是硬编码的。
首先,最终产品并不完全是您所展示的,但是如何设置预期的输出有点多余。根据定义,另一个数组下的填充数组将是子项(" 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
(
)
)