PHP树形结构数据增加每层的级别

一、描述

给树形结构数据加上层级字段levelpid = 0的数据为1级,children里的数据依递增 1

二、代码

1、先转成树形结构,再追加等级字段level到树形结构数据

public function test() {
    
    
    //定义需要处理的数据
    $data = [
        [ 'id' => 1, 'pid' => 0, 'name' => '手机' ],
        [ 'id' => 2, 'pid' => 1, 'name' => 'A手机' ],
        [ 'id' => 3, 'pid' => 2, 'name' => 'A手机充电器' ],
        [ 'id' => 4, 'pid' => 2, 'name' => 'A手机耳机' ],
        [ 'id' => 5, 'pid' => 1, 'name' => 'B手机' ],
        [ 'id' => 6, 'pid' => 5, 'name' => 'B手机充电器' ],
        [ 'id' => 7, 'pid' => 5, 'name' => 'B手机耳机' ],
        [ 'id' => 8, 'pid' => 7, 'name' => '左耳机' ],
        [ 'id' => 9, 'pid' => 7, 'name' => '右耳机' ],
        ['id' => 10, 'pid' => 0, 'name' => '手机C']
    ];

    $treeData = self::generateTree($data);  //处理成数据结构数据

    $this->addGenLevel($treeData); //把树形结果数据处理成最终数据

    var_export($treeData);die;
}

/**
 * 处理成树形结构数据
 * @param $list
 * @param string $pk
 * @param string $pid
 * @param string $child
 * @param int $root
 * @return array
 */
function generateTree($list, $pk = 'id', $pid = 'pid', $child = 'children', $root = 0)
{
    
    
    $tree     = array();
    $packData = array();
    foreach ($list as $data) {
    
    
        $packData[$data[$pk]] = $data;
    }

    foreach ($packData as $key => $val) {
    
    
        if ($val[$pid] == $root) {
    
    
            $tree[] = &$packData[$key]; //代表根节点, 重点一
        } else {
    
    
            $packData[$val[$pid]][$child][] = &$packData[$key]; //找到其父类,重点二
        }
    }
    return $tree;
}

/**
 * 给树形结构数据计算层级字段 Level
 * @param $list
 * @param int $level 数据当前层级
 */
public function addGenLevel(&$list, $level = 0) {
    
    
    $level = $level + 1;
    foreach ($list as &$value) {
    
    
        if (!empty($value['children'])) {
    
    
            $this->addGenLevel($value['children'], $level);
        }
        $value['level'] = $level;
    }
}

2、直接转换成树形结构并加上等级字段level

public function test() {
    
    
    //定义需要处理的数据
    $data = [
        [ 'id' => 1, 'pid' => 0, 'name' => '手机' ],
        [ 'id' => 2, 'pid' => 1, 'name' => 'A手机' ],
        [ 'id' => 3, 'pid' => 2, 'name' => 'A手机充电器' ],
        [ 'id' => 4, 'pid' => 2, 'name' => 'A手机耳机' ],
        [ 'id' => 5, 'pid' => 1, 'name' => 'B手机' ],
        [ 'id' => 6, 'pid' => 5, 'name' => 'B手机充电器' ],
        [ 'id' => 7, 'pid' => 5, 'name' => 'B手机耳机' ],
        [ 'id' => 8, 'pid' => 7, 'name' => '左耳机' ],
        [ 'id' => 9, 'pid' => 7, 'name' => '右耳机' ],
        ['id' => 10, 'pid' => 0, 'name' => '手机C']
    ];

    $treeData = self::getTree($data);  //处理成数据结构数据

    var_export($treeData);die;
}

public function getTree($data, $child = 'children', $pid = 0, $level = 0) {
    
    
    $tree = array();
    $level = $level + 1;
    foreach($data as $k => $v) {
    
    
        if($v['pid'] == $pid) {
    
            // 父亲找到儿子
            $children = $this->getTree($data, $child, $v['id'], $level);
            if ($children) {
    
     //children存在才追加
                $v[$child] = $children;
            }
            $v['level'] = $level;
            $tree[] = $v;
            //unset($data[$k]);
        }
    }
    return $tree;
}

三、部分结果截图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36025814/article/details/108996451
今日推荐