带关联数组的PHP递归(菜单结构)

时间:2013-02-16 10:04:26

标签: php arrays recursion associative

今天我一直在撞墙。我有一个mysql表,其中包含一个具有递归父/子关系的菜单项列表。我需要创建一个匹配它的关联数组。

这是我的代码,下面是我的问题的解释。

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');

PHP代码

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个

2 个答案:

答案 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

我希望这会有所帮助。如果我能想出一种解释它的方法,那就会回来并更新......