【问题标题】:php join multiple json files and group them by idphp加入多个json文件并按id分组
【发布时间】:2016-10-19 13:36:51
【问题描述】:

我有多个 json 文件,我需要将它们全部加入以创建我的动态菜单。

这是当前的输出

{
    "Dashboard": {
        "parent": "Dashboard",
        "url": "#\/dashboard",
        "submenu": []
    },
    "HRM": {
        "submenu": [
            {
                "title": "Holiday",
                "url": "#\/holidays"
            },
            {
                "divider": "true"
            },
            {
                "header": "Header 2"
            },
            {
                "title": "Again...a link.",
                "url": "errrr"
            }
        ]
    } }

这是想要的输出

{
    "parent": "Dashboard",
    "url": "#\/dashboard",
    "submenu": []
}, {
    "parent": "HRM",
    "submenu": [{
            "title": "Holiday",
            "url": "#\/holidays"
    }, {
            "divider": "true"
    }, {
            "header": "Header 2"
    }, {
            "title": "Again...a link.",
            "url": "errrr"
    }, {
            "header": "Holiday"
    },
        {
            "title": "list",
            "url": ""
                },
        {
            "title": "test",
            "url": ""
                }]
}

这是我的 PHP 代码

$files = \File::allFiles($directory);
        foreach ($files as $file)
        {
            if (preg_match("/config.json/i", $file) && \File::size($file) >0) {
                $menu =json_decode(\File::get($file), TRUE)['menu'];
               // $menu = $menu['menu'];

                $id = $menu['parent'];
                    if(!empty($menu['submenu'])){
                        $result[$id]['submenu'] = $menu['submenu'];
                    }else{
                        $result[$id] = $menu;
                    }
            }
        }

JSON 文件 1 个示例

{
    "menu": {
        "parent": "Dashboard",
        "url": "#/dashboard",

        "submenu": [
            ]
    }

}

JSON 文件 2 示例

   {
        "menu": {
            "parent": "HRM",
            "submenu": [
                {
                    "title": "Holiday",
                    "url": "#/holidays"
                    },
                {
                    "divider": "true"
                    },
                {
                    "header": "Header 2"
                    },
                {
                    "title": "Again...a link.",
                    "url": "errrr"
                    }
                ]
        }

    }

JSON 文件 3 示例

   {
        "menu": {
            "parent": "HRM",
            "submenu": [
                {
                    "header": "Holiday"
                    },
                {
                    "title": "list",
                    "url": ""
                    },
                {
                    "title": "test",
                    "url": ""
                    }
                ]
        }

    }

【问题讨论】:

    标签: php arrays json sorting foreach


    【解决方案1】:

    我对你的代码做了一些修改,

    $files = \File::allFiles($directory);
    $result = array();
    
    foreach ($files as $file)
    {
        if (preg_match("/config.json/i", $file) && \File::size($file) >0) {
        $parent = $menu['parent'];
        //checker is used to see if document is already added under an existing parent id
        $checker = true;
    
        foreach($result as $key=>$value){
            if(is_array($value) && $value["parent"]==$parent){
                $checker = false;
                //merging the submenus of equal parent ids
                $submenuSet = array();
                if(!empty($value["submenu"]) && is_array($value["submenu"])){
                    foreach($value["submenu"] as $value1){
                        $submenuSet[] = $value1;
                    }
                }
                if(!empty($menu["submenu"]) && is_array($menu["submenu"])){
                    foreach($menu["submenu"] as $value2){
                        $submenuSet[] = $value2;
                    }
                }
                $value["submenu"] = $submenuSet;
            }
            $result[$key] = $value;
        }
    
        //if a new parent id add it to results
        if($checker){
            $result[] = $menu;
        }
    }
    }
    

    输出是这样的,

    [
      {
        "parent": "Dashboard",
        "url": "#\/dashboard",
        "submenu": [
    
        ]
      },
      {
        "parent": "HRM",
        "submenu": [
          {
            "title": "Holiday",
            "url": "#\/holidays"
          },
          {
            "divider": "true"
          },
          {
            "header": "Header 2"
          },
          {
            "title": "Again...a link.",
            "url": "errrr"
          },
          {
            "header": "Holiday"
          },
          {
            "title": "list",
            "url": ""
          },
          {
            "title": "test",
            "url": ""
          }
        ]
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 2015-03-03
      • 2015-11-18
      • 2019-05-03
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      相关资源
      最近更新 更多