php下不用递归实现无限分类
$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_
))
业务咨询
客服1