带有关联数组的PHP递归(菜单结构)
今天我的头一直撞在墙上。我有一个mysql表,它有一个具有递归父/子关系的菜单项列表。我需要创建一个与之匹配的关联数组 这是我的代码,下面是我的问题的解释 MySQL数据库 PHP代码 =========================================== 从我的主脚本中调用上述函数,如下所示:带有关联数组的PHP递归(菜单结构),php,arrays,recursion,associative,Php,Arrays,Recursion,Associative,今天我的头一直撞在墙上。我有一个mysql表,它有一个具有递归父/子关系的菜单项列表。我需要创建一个与之匹配的关联数组 这是我的代码,下面是我的问题的解释 MySQL数据库 PHP代码 =========================================== 从我的主脚本中调用上述函数,如下所示: $categories[0] = array (); get_children($categories); print "Categories=".print_r($categories
$categories[0] = array ();
get_children($categories);
print "Categories=".print_r($categories);
exit;
==============
我的问题
我的问题是,返回数组的结构与我想要的不太一样
上面的代码返回:
Categories=
Array ( [0] => Array
( [1] => Array
( [1] => Array
( [4] => Array
( [4] => Array ( ) )
[5] => Array
( [5] => Array ( ) )
[9] => Array
( [9] => Array ( ) )
)
)
)
)
我想要的是:
Categories=
Array ( [0] => Array
( [1] => Array
(
( [4] => Array ( ) )
( [5] => Array ( ) )
( [9] => Array ( ) )
)
)
)
空数组表示没有子级
我不知道如何摆脱键值上的双重限制:(
如果有人能帮忙,我将不胜感激
干杯,
Nap您正在通过引用传递
$node
,因此,您不应该执行$node[$key][$row['childid']]=get_children($tmp);
您真的应该这样做
$value[$row['childid']]=get_children($tmp)
或
$node[$row['childid']]=get_children($temp)
但是如果您选择第二个选项,则在第一次调用get_children
时,您必须传入$categories[0]
(这是您在进行定期调用时所做的操作)
更新:
我试着解释一下原因
正如您所看到的,第一个条目(0)没有重复。只有在第一次重复调用之后,问题才开始出现,原因是您正在通过引用传入子数组,因此是第二次[作为示例]调用get\u children
时,$node
变量实际上已经引用了嵌套部分
array(
0=>array(
1=>array(/*this is what $node actually is the second time around*/
/*when you say $node[$key][$row['childid']] what you are actually saying is assign the value to array[0][1][1][4] = array())*/
)
)
);
我希望这能有所帮助。如果我能想出一个解释的方法,我会回来更新…稍微改变一下方法已经解决了我的问题。我没有通过引用传递
$categories
数组,而是传递父菜单项的ID并返回数组
下面的代码使用了与我的OP中给出的相同的SQL数据和SQL访问器函数get\u db\u children($parentid)
。我确信这可以改进,但至少我得到了我的结果
@乔希,谢谢你的意见
PHP函数
function get_twigs($nodeid) {
$result = get_db_children($nodeid);
if ($result->num_rows != 0) {
while ($row = $result->fetch_assoc()) {
$node[$row['childid']] = array();
$node[$row['childid']] = get_twigs($row['childid']);
}
} else {
$node=NULL; // or any other 'no children below me indicator.
}
return $node;
}
function get_branch($nodeid) {
$node[$nodeid] = array();
$node[$nodeid] = get_twigs($nodeid);
return $node;
}
PHP调用程序
$categories = get_branch(0);
终于开始了
:)这是PHP的东西,与sql无关。order by仅确保顺序,不会将行对折:(“where parentid=$parentid”确保返回的数据集只包含那些具有我正在查找的parentid的条目。因此,按parentid分组无论如何都不会有任何效果。我相信问题出在以下行中的get_children()函数:“$node[$key][$row['childid']]=get_children($tmp);”正确您只需从该行中取出$key部分,因为您正在进行嵌套调用,因此您已经引用了子数组。我将尝试更新我的答案,以解释BatterHnx 4需要花费时间,但我无法让您的建议起作用。我已经尝试了第二种方法,但不确定如何传递
$categorie第一种方法:$value[$row['childid']]
引入了一个新的var$value
…它是一个孤儿。如果你愿意,请详细说明。Thnx对于var\u转储的提示:)如果你选择更改代码,我会说再进一步,让它进入一个查询。在循环中执行树逻辑吗
function get_twigs($nodeid) {
$result = get_db_children($nodeid);
if ($result->num_rows != 0) {
while ($row = $result->fetch_assoc()) {
$node[$row['childid']] = array();
$node[$row['childid']] = get_twigs($row['childid']);
}
} else {
$node=NULL; // or any other 'no children below me indicator.
}
return $node;
}
function get_branch($nodeid) {
$node[$nodeid] = array();
$node[$nodeid] = get_twigs($nodeid);
return $node;
}
$categories = get_branch(0);