由于版主的帖子有点久远,在后面回复的话,担心有些同学会看不到,所以单独开这个帖子。版主大大发表于 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,),
);
递归树状无限分类

解决方案 »

  1.   

    更新一个版本/**
     * 将“邻接列表算法”组织的数据转换成树状数组
     * @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;
    }
      

  2.   

    本帖最后由 xuzuning 于 2013-06-09 15:52:20 编辑
      

  3.   


    不知下面这个数组是否符合 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,),
    );