递归遍历
数据格式: "data": [
{
"label": "技术部",
"id": "1",
"parent_id": "0",
"children": [
{
"label": "财务部",
"id": "22",
"parent_id": "1"
},
{
"label": "菜鸟部",
"id": "3",
"parent_id": "1",
"children": [
{
"label": "人事部",
"id": "4",
"parent_id": "3"
}
]
}
]
} ]
/**
* 分类树状图
*
* @param $request
* @return mixed
*/
public function index($request)
{
//如果数据太大,建议分批获取数据
$collection = $this->model->select('name as label', 'id', 'parent_id')->get()->toArray();
return $this->getDepartments($collection);
}
/**
* 递归获取部门
*
* @param $name
* @param $collection
* @param string $parentId
* @param null $item
* @return array
*/
public function getDepartments(&$collection, $parentId = '0', &$item = null, $name = 'children')
{
$tree = [];
foreach ($collection as $key => $value) {
if ($value['parent_id'] == $parentId) {
self::shiftCollection($collection, $value, $key);
if ($item) $item[$name][] = $value;
else $tree[] = $value;
}
};
return $tree;
}
/**
* 删除已分配的元素(可减少循环, 减少内存占用)
*
* @param $key
* @param $collection
* @param $value
*/
public function shiftCollection(&$collection, &$value, $key)
{
unset($collection[$key]);
self::getDepartments($collection, $value['id'], $value);
}