You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何将包含子数组的静态数据完整转换为集合?

解决Laravel中嵌套静态数组转集合/对象的问题

嘿,我懂你的困扰!你当前的代码只处理了顶层的菜单数组元素,没有递归处理里面的children子数组,所以才会出现只有主数组被转换,子数组还是原格式的情况。下面给你两种解决方案,根据你的实际需求选择:

方案1:将所有层级转成Laravel Collection

如果你希望整个菜单结构(包括嵌套的children)都变成Laravel集合,可以写一个递归函数来处理所有层级的数组:

// 递归处理数组,将所有层级转成Collection
private static function convertToCollection($data) {
    if (is_array($data)) {
        return collect($data)->map(function ($item) {
            return self::convertToCollection($item);
        });
    }
    return $data;
}

public static function menuList() {
    return self::convertToCollection(self::$menu_list);
}

这个方法会遍历每一层数据,只要是数组就转成Collection,不管嵌套多少层都能轻松处理。

方案2:将所有层级转成嵌套对象(和你原代码逻辑一致)

如果你还是想保持原代码的逻辑,把所有数组转成对象(包括children),同样用递归处理就能实现:

// 递归处理数组,将所有层级转成对象
private static function convertToObject($data) {
    if (is_array($data)) {
        return (object)array_map([self::class, 'convertToObject'], $data);
    }
    return $data;
}

public static function menuList() {
    return collect(self::$menu_list)->map(function ($item) {
        return self::convertToObject($item);
    });
}

这样调用menuList()后,返回的集合里每个菜单项都是对象,里面的children也会是对象,完全符合你的需求。

小提示

如果你的菜单只有一层children嵌套(像你给出的例子那样),也可以不用单独写递归函数,直接在map里处理:

public static function menuList() {
    return collect(self::$menu_list)->map(function ($item) {
        // 检查并处理children
        if (isset($item['children']) && is_array($item['children'])) {
            $item['children'] = (object)$item['children'];
        }
        return (object)$item;
    });
}

但递归方案更灵活,后续菜单加多层嵌套也不用改代码~

内容的提问来源于stack exchange,提问作者TaSvet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:03:10