由于版主的帖子有点久远,在后面回复的话,担心有些同学会看不到,所以单独开这个帖子。版主大大发表于 2013-02-04 11:46:06 的《读取树状数据的方法》的帖子有bug。
bug描述:当子数据在父数据之前出现时,构造失败。经过修改测试,应该可以正常工作了,欢迎大家使用各种数据进行测试,有问题大家一起探讨。/**
* 将“邻接列表算法”组织的数据转换成树状数组
* @param array 二维数据数组
* @return array 多维树状数组
*/
function tree($arr){
$res = array(); //结果数组
$ind = array(); //索引数组
foreach($arr as $k=>$v) {
list($id, $pid) = array_values($v);
if(isset($ind[$id])){
$ind[$id] = array_merge($v, $ind[$id]);
}else{
$ind[$id] = $v;
}
$ind[$pid]['child'][$id] = &$ind[$id]; //构造索引
if($pid == 0) $res[$id] = &$ind[$id]; //转存根节点组
}
return $res;
}
// 测试用数组
$arr = array(
array('id'=>9, 'pid'=>12,),
array('id'=>10, 'pid'=>13,),
array('id'=>11, 'pid'=>13,),
array('id'=>12, 'pid'=>14,),
array('id'=>14, 'pid'=>0,),
array('id'=>15, 'pid'=>0,),
array('id'=>13, 'pid'=>14,),
array('id'=>17, 'pid'=>15,),
array('id'=>16, 'pid'=>17,),
array('id'=>18, 'pid'=>16,),
array('id'=>19, 'pid'=>15,),
);
递归树状无限分类
bug描述:当子数据在父数据之前出现时,构造失败。经过修改测试,应该可以正常工作了,欢迎大家使用各种数据进行测试,有问题大家一起探讨。/**
* 将“邻接列表算法”组织的数据转换成树状数组
* @param array 二维数据数组
* @return array 多维树状数组
*/
function tree($arr){
$res = array(); //结果数组
$ind = array(); //索引数组
foreach($arr as $k=>$v) {
list($id, $pid) = array_values($v);
if(isset($ind[$id])){
$ind[$id] = array_merge($v, $ind[$id]);
}else{
$ind[$id] = $v;
}
$ind[$pid]['child'][$id] = &$ind[$id]; //构造索引
if($pid == 0) $res[$id] = &$ind[$id]; //转存根节点组
}
return $res;
}
// 测试用数组
$arr = array(
array('id'=>9, 'pid'=>12,),
array('id'=>10, 'pid'=>13,),
array('id'=>11, 'pid'=>13,),
array('id'=>12, 'pid'=>14,),
array('id'=>14, 'pid'=>0,),
array('id'=>15, 'pid'=>0,),
array('id'=>13, 'pid'=>14,),
array('id'=>17, 'pid'=>15,),
array('id'=>16, 'pid'=>17,),
array('id'=>18, 'pid'=>16,),
array('id'=>19, 'pid'=>15,),
);
递归树状无限分类
* 将“邻接列表算法”组织的数据转换成树状数组
* @param array 二维数据数组
* @param int 要查找的父ID
* @return array 多维树状数组
*/
function tree($arr, $parent_id = 0){
$tmp = array();
foreach($arr as $k=>$v) {
list($id, $pid) = array_values($v);
if(isset($tmp[$id])){
$tmp[$id] = array_merge($v, $tmp[$id]);
}else{
$tmp[$id] = $v;
}
$tmp[$pid]['child'][$id] = &$tmp[$id];
}
$list = array();
if(0 == $parent_id){
$list = $tmp[0]['child'];
}else{
$list = $tmp[$parent_id];
}
unset($tmp);
return $res;
}
不知下面这个数组是否符合 order by pid, id$arr = array(
array('id'=>13, 'pid'=>0,),
array('id'=>14, 'pid'=>0,),
array('id'=>9, 'pid'=>12,),
array('id'=>10, 'pid'=>13,),
array('id'=>11, 'pid'=>13,),
array('id'=>12, 'pid'=>14,),
);