一、描述
给树形结构数据加上层级字段
level
,pid = 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;
}