laravel 递归 无限层级分类

递归遍历

数据格式: "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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值