首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

PHP数组分级,百般无奈,救助

2013-01-17 
PHP数组分级,万般无奈,救助array (array(level 1, caption 一级菜单1),array(leve1 1

PHP数组分级,万般无奈,救助
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?菜单?递归
[解决办法]
你连搜索搜不会,怎么查资料做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
照着上面抄吧,先完成了,有空自己再理解人家的递归方法

偶忙着做其他事情
[解决办法]
参考下我写的 




<?
$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。

理解下这样的结构就好入手了。
[解决办法]
<?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]);

这种方法的核心是引用传递,思路还是递归,只是换了种方式实现

[解决办法]
本帖最后由 xuzuning 于 2013-01-12 11:16:59 编辑 算法很多(递归)
$ar = 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"),
);
print_r( foo($ar));

function foo(&$ar, $level='1') {
  $res = array();
  while($r = current($ar)) {
    if($r['level'] > $level) $res[count($res)-1]['sub'] = foo($ar, $r['level']);
    elseif($r['level'] == $level) $res[] = $r;
    else {
      array_unshift($ar, $r);
      break;
    }
    array_shift($ar);
  }
  return $res;
}
Array
(
    [0] => Array
        (
            [level] => 1
            [caption] => 一级菜单1
        )



    [1] => Array
        (
            [level] => 1
            [caption] => 一级菜单2
            [sub] => Array
                (
                    [0] => Array
                        (
                            [level] => 2
                            [caption] => 二级菜单1
                        )

                    [1] => Array
                        (
                            [level] => 2
                            [caption] => 二级菜单2
                            [sub] => Array
                                (
                                    [0] => Array
                                        (
                                            [level] => 3
                                            [caption] => 三级菜单1
                                        )

                                )

                        )



                )

        )

    [2] => Array
        (
            [level] => 1
            [caption] => 一级菜单3
        )

)

热点排行