求救,php无限极分类不用递归怎么处理成层级结构?

`$arr = array(
array('id' => 1, 'pid' => 0, 'name' => '分类1'),
array('id' => 2, 'pid' => 0, 'name' => '分类2'),
array('id' => 3, 'pid' => 0, 'name' => '分类3'),
array('id' => 4, 'pid' => 2, 'name' => '分类2-1'),
array('id' => 5, 'pid' => 6, 'name' => '分类4-1'),
array('id' => 6, 'pid' => 0, 'name' => '分类4'),
array('id' => 7, 'pid' => 3, 'name' => '分类3-1'),
array('id' => 8, 'pid' => 1, 'name' => '分类1-1'),
array('id' => 9, 'pid' => 1, 'name' => '分类1-2'),
array('id' => 10, 'pid' => 5, 'name' => '分类4-1-1'),
array('id' => 11, 'pid' => 9, 'name' => '分类1-2-1'),
array('id' => 12, 'pid' => 7, 'name' => '分类3-1-1'),
array('id' => 13, 'pid' => 4, 'name' => '分类2-1-1'),
array('id' => 14, 'pid' => 3, 'name' => '分类3-2'),
array('id' => 15, 'pid' => 10, 'name' => '分类4-1-1-1')
);`

以上数组 不用递归如何处理成以下数组结构,怎么做优化?

`$newarr = array (
array ('id' => 1, 'pid' => 0, 'name' => '分类1', 'level' => 0,),
array ('id' => 8, 'pid' => 1, 'name' => '分类1-1', 'level' => 1,),
array ('id' => 9, 'pid' => 1, 'name' => '分类1-2', 'level' => 1,),
array ('id' => 11, 'pid' => 9, 'name' => '分类1-2-1', 'level' => 2,),
array ('id' => 2, 'pid' => 0, 'name' => '分类2', 'level' => 0,),
array ('id' => 4, 'pid' => 2, 'name' => '分类2-1', 'level' => 1,),
array ('id' => 13, 'pid' => 4, 'name' => '分类2-1-1', 'level' => 2,),
array ('id' => 3, 'pid' => 0, 'name' => '分类3', 'level' => 0,),
array ('id' => 7, 'pid' => 3, 'name' => '分类3-1', 'level' => 1,),
array ('id' => 12, 'pid' => 7, 'name' => '分类3-1-1', 'level' => 2,),
array ('id' => 14, 'pid' => 3, 'name' => '分类3-2', 'level' => 1,),
array ('id' => 6, 'pid' => 0, 'name' => '分类4', 'level' => 0,),
array ('id' => 5, 'pid' => 6, 'name' => '分类4-1', 'level' => 1,),
array ('id' => 10, 'pid' => 5, 'name' => '分类4-1-1', 'level' => 2,),
array ('id' => 15, 'pid' => 10, 'name' => '分类4-1-1-1', 'level' => 3,),
);`

阅读 2.4k
2 个回答
/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {
    // 创建Tree
    $tree = array();
    if(is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId =  $data[$pid];
            if ($root == $parentId) {
                $tree[] =& $list[$key];
            }else{
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $parent[$child][] =& $list[$key];
                }
            }
        }
    }
    return $tree;
}

来源:https://gitee.com/liu21st/one...

php数组模拟栈,当然你也可以用SPL双向链表类操作,实现不递归层序转化

  1. 确保待处理数据源有序性,以pid优先,id次之,usort 自定义
  2. 大量使用php内置函数+双循环的形式,至于是否为负优化自测时间吧
function cmp($a, $b){
    if ($a['pid'] == $b['pid']) {
        return $a['id'] < $b['id'] ? -1 : 1;
    }
    return ($a['pid'] < $b['pid']) ? -1 : 1;
}
usort($arr, "cmp");
echo json_encode($arr);
echo "\n----------\n";

使用排序后的数据源 $arr 转为结果集$rs

$rs = [];
while(count($arr)>0){
    $head = array_shift($arr);
    array_push($rs,$head);
    $pid = [];
    array_push($pid, $head['id']);
    while(count($pid)>0 && count($arr)>0){
        $ids = array_column($arr,'pid','id');
        $key = array_search($pid[count($pid)-1], $ids);
        if($key === false){
            array_pop($pid);
        }else{
            array_push($pid,$key);
            $index= array_search($key, array_column($arr,'id'));
            array_push($rs,$arr[$index]);
            array_splice($arr,$index,1);
        }
    }
}
echo json_encode($rs);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题