一、无限分类表
id
name 分类名
pid 父级id
二、代码
//定义需要处理的数据
$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 = generateTree($data); //处理成数据结构数据
$result = []; //定义结果数据
handleTreeData($treeData, '', '', $result); //把树形结果数据处理成最终数据
var_export($result);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;
}
/**
* 递归处理树形结构的数据
* @param $treeData 树形结构数据
* @param $fatherName 父级 $name
* @param $detailName 详情 $name
* @param $result 结果数据
*/
function handleTreeData($treeData, $fatherName, $detailName, &$result) {
$detailName .= $fatherName ? ($fatherName . ' - ') : ''; //child下有数据,则追加该child的$fatherName信息
foreach ($treeData as $value) {
$name = $value['name']; //单条数据的详细信息
$result[] = [ //数据追加
'id' => $value['id'],
'name' => $detailName . $name
];
if (isset($value['children'])) { //如果child存在,则循环单个child下的数据
handleTreeData($value['children'], $name, $detailName, $result);
}
}
}
generteTree方法得到树形结构数据 handleTreeData得到数据