今天我一直在撞墙。我有一个mysql表,其中包含一个具有递归父/子关系的菜单项列表。我需要创建一个匹配它的关联数组。
这是我的代码,下面是我的问题的解释。
CREATE TABLE IF NOT EXISTS `menus` (
`sectionid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parentid` int(10) unsigned NOT NULL DEFAULT '0',
`name` varchar(128) NOT NULL DEFAULT '',
PRIMARY KEY (`sectionid`)
);
INSERT INTO `menus` (`sectionid`, `parentid`, `name`) VALUES
(1, 0,'DOWNLOADS'),(4, 1,'Player Scenarios'),
(5, 1,'Co Op Scenarios'),(9, 1,'MAPS');
function get_db_children($parentid) {
$mysqli = mysqli_open();
$sqlStr = "select sectionid as childid from menus where parentid=$parentid order by sectionid";
$result = $mysqli->query($sqlStr);
$mysqli->close();
return $result;
}
function get_children(&$node) {
foreach ($node as $key=>$value) {
$result = get_db_children($key);
while ($row = $result->fetch_assoc()) {
$tmp = array($row['childid'] => array());
$node[$key][$row['childid']]= get_children($tmp);
}
}
return $node;
}
===========================================
以上函数从我的主脚本调用如下:
$categories[0] = array ();
get_children($categories);
print "Categories=".print_r($categories);
exit;
==============
我的问题。
我的问题是返回数组的结构不是我想要的QUITE。
上面的代码返回:
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 ( ) )
)
)
)
空数组表示没有子项。
我无法弄清楚如何摆脱关键值的加倍。 :(
如果有人可以提供帮助,我们将不胜感激。
干杯, N ap个
答案 0 :(得分:1)
稍微改变方法已经解决了我的问题。我不是通过引用传递$categories
数组,而是传递父菜单项的ID并返回数组。
下面的代码使用我的OP中给出的相同的SQL数据和SQL访问器函数get_db_children($parentid)
。我相信这可以改进,但至少我得到了我的结果。
@Josh,thnx的输入。
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);
终于开始了。
:)
答案 1 :(得分:0)
你是通过引用传递$node
因此而不是做$node[$key][$row['childid']] = get_children($tmp);
你应该做的事情
$value[$row['childid']] = get_children($tmp)
或
$node[$row['childid']] = get_children($temp)
但是如果您使用第二个选项,则必须在第一次拨打$categories[0]
时传递get_children
(这是您在进行定期呼叫时正在执行的操作)
如您所见,第一个条目(0)不重复。只有在第一次重复调用问题开始之后,原因才在于您通过引用传递子数组,因此当您调用get_children
{{1}时第二次[作为示例] var实际上已经引用了嵌套部分
$node
我希望这会有所帮助。如果我能想出一种解释它的方法,那就会回来并更新......