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
相关产品推荐
相关产品推荐

