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

带有关联数组的PHP递归(菜单结构),php,arrays,recursion,associative,Php,Arrays,Recursion,Associative,今天我的头一直撞在墙上。我有一个mysql表,它有一个具有递归父/子关系的菜单项列表。我需要创建一个与之匹配的关联数组 这是我的代码,下面是我的问题的解释 MySQL数据库 PHP代码 =========================================== 从我的主脚本中调用上述函数,如下所示: $categories[0] = array (); get_children($categories); print "Categories=".print_r($categories

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

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

MySQL数据库 PHP代码 ===========================================

从我的主脚本中调用上述函数,如下所示:

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