如何将JOIN后的菜单数据按分类整理为嵌套数组?
如何将JOIN后的菜单数据整理为嵌套数组结构
我通过INNER JOIN关联menu_categories表与menu表得到查询结果,想要将同分类的菜单数据整理为嵌套数组结构,但现有代码无法实现预期效果。
现有代码
$arr1 = []; $arr2 = []; foreach($menu as $allmenu) { $cat_id = $allmenu->menu_category_id; foreach($allmenu as $key => $value) { if($key === 'menu_category_id' && $cat_id === $allmenu->menu_category_id) { $arr1[] = [ 'menu_name'=> $allmenu->menu_name, 'link' => $allmenu->link, 'icon' => $allmenu->icon, ]; } } $arr2['new_menu_array'][] = $arr1; }
当前查询结果
Array ( [0] => stdClass Object ( [category_name] => Settings [category_icon] => [menu_name] => Create settings [link] => /create_settings [menu_category_id] => 1 [icon] => Cgear ) [1] => stdClass Object ( [category_name] => Settings [category_icon] => [menu_name] => Edit settings [link] => /edit_settings [menu_category_id] => 1 [icon] => Egear ) [2] => stdClass Object ( [category_name] => Users [category_icon] => [menu_name] => Create user [link] => /create_user [menu_category_id] => 2 [icon] => Chuman ) )
期望的嵌套结构
Array ( [0] => stdClass Object ( [category_name] => Settings [category_icon] => [new_menu_array] => Array ( [0] => Array ( [menu_name] => Create settings [link] => /create_settings [icon] => Cgear ) [1] => Array ( [menu_name] => Edit settings [link] => /edit_settings [icon] => Egear ) ) ) [1] => stdClass Object ( [category_name] => Users [category_icon] => [new_menu_array] => Array ( [0] => Array ( [menu_name] => Create user [link] => /create_user [icon] => Chuman ) ) ) )
解决方案
你可以通过按分类ID分组的方式实现嵌套结构,代码如下:
$result = []; $temp = []; foreach ($menu as $item) { $catId = $item->menu_category_id; // 如果该分类还未在临时数组中,初始化分类信息 if (!isset($temp[$catId])) { $temp[$catId] = (object)[ 'category_name' => $item->category_name, 'category_icon' => $item->category_icon, 'new_menu_array' => [] ]; } // 将当前菜单添加到对应分类的菜单列表中 $temp[$catId]->new_menu_array[] = [ 'menu_name' => $item->menu_name, 'link' => $item->link, 'icon' => $item->icon ]; } // 将关联数组转为索引数组,得到最终结果 $result = array_values($temp);
代码说明:
- 使用
$temp临时数组,以menu_category_id为键,避免重复创建分类对象 - 遍历原始数据时,先检查分类是否已存在,不存在则初始化分类的基础信息
- 将每个菜单条目添加到对应分类的
new_menu_array中 - 最后用
array_values()将关联数组转为索引数组,匹配期望的结构
内容的提问来源于stack exchange,提问作者mohsin ali
相关产品推荐
相关产品推荐

