1、递归法实现
将原始数组无限循环,按照层级向下找到子类并归类,找到一个删除一个,直到原始数组下最后一组数据
function getChildTree($data, $id = 0)
{
//初始化儿子
$child = [];
//循环所有数据找$id的儿子
foreach ($data as $key => $datum) {
//找到儿子了
if ($datum['pid'] == $id) {
//保存下来,然后继续找儿子的儿子
$child[$datum['id']] = $datum;
//先去掉自己,自己不可能是自己的儿孙
unset($data[$key]);
//递归找,并把找到的儿子放到一个child的字段中
$child[$datum['id']]['child'] = $this->getChildTree($data, $datum['id']);
}
}
return $child;
}
2、引用实现
先将原始数组中的id作为键值重新排序一下, 然后通过 &引用根节点地址来赋值
function getChildTree($data)
{
$tree = [];
$newData = [];
//循环重新排列
foreach ($data as $datum) {
$newData[$datum['id']] = $datum;
}
foreach ($newData as $key => $datum) {
if ($datum['pid'] > 0) {
//不是根节点的将自己的地址放到父级的child节点
$newData[$datum['pid']]['child'][] = &$newData[$key];
} else {
//根节点直接把地址放到新数组中
$tree[] = &$newData[$datum['id']];
}
}
return $tree;
}