array (
       array("level" => '1', "caption" => "一级菜单1"),
       array("leve1" => '1', "caption" => "一级菜单2"),
       array("leve1" => '2', "caption" => "二级菜单1"),
       array("leve1" => '2', "caption" => "二级菜单2"),
       array("leve1" => '1', "caption" => "一级菜单3"),
      )
其中level = 2为其上方最近leve1 = 1 的子菜单,不排除会有level = 3的子菜单(从属于level = 2)现在想弄成下面的形式,想了好久也没什么好方法,同事建议我用递归,可递归小弟不太懂,PHP初接触,给各位大拿添麻烦了
array (
       array("level" => '1', "caption" => "一级菜单1"),
       array("leve1" => '1', "caption" => "一级菜单2",
             "sub"=>array("leve1" => '2', "caption" => "二级菜单1"),
             "sub"=>array("leve1" => '2', "caption" => "二级菜单2")
             ),
       array("leve1" => '1', "caption" => "一级菜单3"),
      )
php 菜单 递归

解决方案 »

  1.   

    你连搜索搜不会,怎么查资料做IT啊?
    搜“php 无限分类”http://bbs.csdn.net/topics/360028778
    http://bbs.csdn.net/topics/250025103
    http://bbs.csdn.net/topics/320022124
    ……你的数组里面 
    level 相当于 pid(把=1改为=0)
    caption 拆分为 id 和 name
    照着上面抄吧,先完成了,有空自己再理解人家的递归方法偶忙着做其他事情
      

  2.   

    参考下我写的 
    <?
    $arr = array(
        
        array('id'=>1,'city_name'=>'中国','rel_id'=>'1','pid'=>0),
        array('id'=>2,'city_name'=>'广东','rel_id'=>'1-2','pid'=>1),
        array('id'=>3,'city_name'=>'深圳','rel_id'=>'1-2-3','pid'=>2),
        array('id'=>4,'city_name'=>'广州','rel_id'=>'1-2-4','pid'=>2)
       
    );function find_subclass( $pid ){
        
        global $arr;
        $__arr = array();
        foreach ( $arr as $k=>$v )
        {
            
            if( $v['pid']==$pid )$__arr[] = $v;
            
        }
        return $__arr;
        
    }function tree_subclass($pid=0){
        
        $__arr = array();
        $__arr = find_subclass($pid);
        if( !empty($__arr) ){
            
            foreach ( $__arr as $k=>$v )
            {            $__arr[$k]['subclass'] = tree_subclass($v['id']);
                
            }
            
        }
        return $__arr;
    }var_dump(tree_subclass(0));?>运行一下。主要是加了个用id及父id去将节点关系联系起来的。比如  广州的父id是广东id,广东的父id是中国的id。理解下这样的结构就好入手了。
      

  3.   

    您期望的结果数组数非法的
    array (
           array("level" => '1', "caption" => "一级菜单1"),
           array("leve1" => '1', "caption" => "一级菜单2",
                 "sub"=>array("leve1" => '2', "caption" => "二级菜单1"),
                 "sub"=>array("leve1" => '2', "caption" => "二级菜单2")
                 ),
           array("leve1" => '1', "caption" => "一级菜单3"),
          )
    任何数组都不会在同一结构中出现同名的键你先调整好需求,再提问
      

  4.   


    实在对不起楼上几位,刚看到版主的回复,发帖的时候没有检查清楚,确实是数组结构错误了,十分抱歉期望的数组结构应该是下面这样
    array (
           array("level" => '1', "caption" => "一级菜单1"),
           array("leve1" => '1', "caption" => "一级菜单2",
                 "sub"=>array( 
                               array("leve1" => '2', "caption" => "二级菜单1"),
                               array("leve1" => '2', "caption" => "二级菜单2")
                             )
                 ),
           array("leve1" => '1', "caption" => "一级菜单3"),
          )
      

  5.   


    大概明白了一点,主要是要在父菜单与子菜单之间添加一个关联用的节点,也就是pid,id,
    在递归的时候利用父节点对应的子节点id找到子节点中的菜单名理解的不知道是不是有问题,请指教
      

  6.   

    <?php
    $data = array (
           array("level" => '1', "caption" => "一级菜单1"),
           array("level" => '1', "caption" => "一级菜单2"),
           array("level" => '2', "caption" => "二级菜单1"),
           array("level" => '2', "caption" => "二级菜单2"),
           array("level" => '3', "caption" => "三级菜单1"),
           array("level" => '1', "caption" => "一级菜单3"),
          );
    $last = array(0=>array());
    foreach($data as $k=>&$v){ 
          $v['level'] = (int)$v['level'];
          $last = array_slice($last, 0, $v['level']);
          $last[$v['level']] = &$v;
          $last[$v['level']-1]['sub'][] = &$last[$v['level']];
    }
    var_dump( $last[0]);
    这种方法的核心是引用传递,思路还是递归,只是换了种方式实现
      

  7.   

    本帖最后由 xuzuning 于 2013-01-12 11:16:59 编辑
      

  8.   

    回帖晚了 现在结贴
    感谢snmr_com提供的链接,
    anydy2008提供实际代码帮助我理解迭代,    dream1206和版主分别提供的两种实现方式,
      

  9.   

    anydy2008提供的实际代码对我理解递归很有帮助,dream1206和版主分别提供的两种实现方式也对我有很大启发,再次感谢