您当前的位置:首页 >> 网站建设
RSS

php下不用递归实现无限分类

作者: E族网络 来源: 2010-01-02
实现无限分类菜单一直是问的比较多的问题,我也曾经在这个问题上焦头烂额,现在提供一种简单的算法,我把无限分类中的数组变成一种更扁平的结构,然后加上deep(节点深度)即可作出树形菜单。本文中的函数会对数组做逆向排序(数值越大越靠前)。数组如下:
$arr = array(
   array('parent_cid'=>0,'id'=>1,'sort_order'=>0),
   array('parent_cid'=>1,'id'=>2,'sort_order'=>1),
   array('parent_cid'=>1,'id'=>3,'sort_order'=>0),
   array('parent_cid'=>1,'id'=>4,'sort_order'=>2),
   array('parent_cid'=>3,'id'=>5,'sort_order'=>2),
   array('parent_cid'=>3,'id'=>6,'sort_order'=>0),
   array('parent_cid'=>0,'id'=>7,'sort_order'=>3),
   array('parent_cid'=>6,'id'=>8,'sort_order'=>0),
   array('parent_cid'=>6,'id'=>9,'sort_order'=>1),
   array('parent_cid'=>0,'id'=>10,'sort_order'=>0),
   array('parent_cid'=>9,'id'=>11,'sort_order'=>0),
   array('parent_cid'=>0,'id'=>12,'sort_order'=>1),
   array('parent_cid'=>10,'id'=>13,'sort_order'=>2),
   array('parent_cid'=>10,'id'=>14,'sort_order'=>3)
   )
算法如下:
function parse($tree_arr)
{
 uasort($tree_arr,"parent_cmp");
 $tree = array();
 $index = array();
 $deep = 0;
 foreach($tree_arr as $v)
 {
  if($v['parent_cid']==0)
  {
   $key = '0_'.$v['sort_order'].'_'.$v['id'].'_';
   $v['deep'] = 0;
   $v['key'] = $key;
   $tree[$key] = $v;
  }
  else
  {
   $key = $index[$v['parent_cid']]['key'].'_'.$v['parent_cid'].'_'.$v['sort_order'].'_'.$v['id'].'_';
   $v['deep'] = count(explode('_',$key))/4-1;
   $v['key'] = $key;
   $tree[$key] = $v;
  }
  $index[$v['id']] =& $tree[$key];
 }
 usort($tree,'kcmp');
 return $tree;
}
function kcmp($a, $b)
{
 $akl = strlen($a['key']);
 $bkl = strlen($b['key']);
 if($akl<$bkl && substr($b['key'],0,$akl)==$a['key']) return -1;
 elseif($akl>$bkl && substr($a['key'],0,$bkl)==$b['key']) return 1;
 return strnatcmp($b['key'], $a['key']);
}
function parent_cmp($a,$b)
{
 if($a['parent_cid'] == $b['parent_cid']) return 0;
 return $a['parent_cid'] > $b['parent_cid'] ? 1 : -1;
}
最终解析后变成下列的数组,相信一维的数组做起来应该简单的多:
pring_r(parse($arr));//得到如下的结果

Array
(
    [0] => Array
        (
            [parent_cid] => 0
            [id] => 7
            [sort_order] => 3
            [deep] => 0
            [key] => 0_3_7_
        )

    [1] => Array
        (
            [parent_cid] => 0
            [id] => 12
            [sort_order] => 1
            [deep] => 0
            [key] => 0_1_12_
        )

    [2] => Array
        (
            [parent_cid] => 0
            [id] => 10
            [sort_order] => 0
            [deep] => 0
            [key] => 0_0_10_
        )

    [3] => Array
        (
            [parent_cid] => 10
            [id] => 14
            [sort_order] => 3
            [deep] => 1
            [key] => 0_0_10__10_3_14_
        )

    [4] => Array
        (
            [parent_cid] => 10
            [id] => 13
            [sort_order] => 2
            [deep] => 1
            [key] => 0_0_10__10_2_13_
        )

    [5] => Array
        (
            [parent_cid] => 0
            [id] => 1
            [sort_order] => 0
            [deep] => 0
            [key] => 0_0_1_
        )

    [6] => Array
        (
            [parent_cid] => 1
            [id] => 4
            [sort_order] => 2
            [deep] => 1
            [key] => 0_0_1__1_2_4_
        )

    [7] => Array
        (
            [parent_cid] => 1
            [id] => 2
            [sort_order] => 1
            [deep] => 1
            [key] => 0_0_1__1_1_2_
        )

    [8] => Array
        (
            [parent_cid] => 1
            [id] => 3
            [sort_order] => 0
            [deep] => 1
            [key] => 0_0_1__1_0_3_
        )

    [9] => Array
        (
            [parent_cid] => 3
            [id] => 5
            [sort_order] => 2
            [deep] => 2
            [key] => 0_0_1__1_0_3__3_2_5_
        )

    [10] => Array
        (
            [parent_cid] => 3
            [id] => 6
            [sort_order] => 0
            [deep] => 2
            [key] => 0_0_1__1_0_3__3_0_6_
        )

    [11] => Array
        (
            [parent_cid] => 6
            [id] => 9
            [sort_order] => 1
            [deep] => 3
            [key] => 0_0_1__1_0_3__3_0_6__6_1_9_
        )

    [12] => Array
        (
            [parent_cid] => 9
            [id] => 11
            [sort_order] => 0
            [deep] => 4
            [key] => 0_0_1__1_0_3__3_0_6__6_1_9__9_0_11_
        )

    [13] => Array
        (
            [parent_cid] => 6
            [id] => 8
            [sort_order] => 0
            [deep] => 3
            [key] => 0_0_1__1_0_3__3_0_6__6_0_8_
        )

)

这个算法没有很详细的测试,在正式使用时可能需要进一步改进,这里只是提供一种思路

联系E族

关闭
  • 即时信息
  • 详细信息

发送