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

如何将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);

代码说明:

  1. 使用$temp临时数组,以menu_category_id为键,避免重复创建分类对象
  2. 遍历原始数据时,先检查分类是否已存在,不存在则初始化分类的基础信息
  3. 将每个菜单条目添加到对应分类的new_menu_array中
  4. 最后用array_values()将关联数组转为索引数组,匹配期望的结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:13:19