Проблема с форматированием php json

В настоящее время я застрял в форматировании json для php. Ниже я привел свой выходной файл json. Что мне нужно сделать, так это сделать формат текущего json желаемым. Мне не хватает массивов в формате JSON. Может ли кто-нибудь помочь мне в этом.

Мой код для печати вывода json приведен ниже:

$menuHead=array(); 
$i=0; 
foreach($res as $key => $value){ 
    $i=$key+1;
    //$menuHead[$i]['menuHead']=$value['category'];
    if (isset($menuHead[$key]['menuHead'])){
        if ($menuHead[$key]['menuHead']==$value['category']){
          $menuHead[$key]['data'][$i]['itemName']=$value['sub_category'];
          $menuHead[$key]['data'][$i]['price']=$value['price'];
          $menuHead[$key]['data'][$i]['description']=$value['description'];
          $menuHead[$key]['data'][$i]['itemId']=$value['id'];
          $menuHead[$key]['data'][$i]['customizable']=$value['customizable'];
        }else{
          $menuHead[$i]['menuHead']=$value['category'];
          $menuHead[$i]['data'][$i]['itemName']=$value['sub_category'];  
          $menuHead[$i]['data'][$i]['price']=$value['price'];
          $menuHead[$i]['data'][$i]['description']=$value['description'];
          $menuHead[$i]['data'][$i]['itemId']=$value['id'];
          $menuHead[$i]['data'][$i]['customizable']=$value['customizable'];
        }
    }else{
      $menuHead[$i]['menuHead']=$value['category'];
      $menuHead[$i]['data'][$i]['itemName']=$value['sub_category'];  
      $menuHead[$i]['data'][$i]['price']=$value['price'];
      $menuHead[$i]['data'][$i]['description']=$value['description'];
      $menuHead[$i]['data'][$i]['itemId']=$value['id'];
      $menuHead[$i]['data'][$i]['customizable']=$value['customizable'];
    }    
}
$final['MenuList']=$menuHead;
echo json_encode($final);

Текущий формат:

    {
  "MenuList": {
    "1": {
      "menuHead": "Main Course",
      "data": {
        "1": {
          "itemName": "Chicken Thai Curry",
          "price": "599",
          "description": "",
          "itemId": "67",
          "customizable": "1"
        }
      }
    },
    "2": {
      "menuHead": "Refreshments",
      "data": {
        "2": {
          "itemName": "Kingfisher Premium",
          "price": "999",
          "description": "Kingfisher beer",
          "itemId": "69",
          "customizable": "1"
        },
        "3": {
          "itemName": "Mocktail",
          "price": "999",
          "description": "",
          "itemId": "68",
          "customizable": "1"
        }
      }
    },
    "4": {
      "menuHead": "Rice biriyani",
      "data": {
        "4": {
          "itemName": "Dal makni risotto",
          "price": "499",
          "description": "Dal makhni risotto",
          "itemId": "66",
          "customizable": "1"
        }
      }
    }
  }
}

Желаемый формат:

    {
  "menuList": [
    {
      "menuHead": "In Steamer (Momos)",
      "data": [
        {
          "itemName": "Tandoori Momo",
          "description": "",
          "price": "150",
          "itemId": "16",
          "customizable": "0"
        },
        {
          "itemName": "Fried Momo Pork",
          "price": "100",
          "description": "",
          "itemId": "15",
          "customizable": "0"
        }
      ]
    },
    {
      "itemName": "Rice and Noodles",
      "data": [
        {
          "sub_category": "Tandoori Momo",
          "description": "",
          "price": "150",
          "itemId": "16",
          "customizable": "0"
        },
        {
          "itemName": "Fried Momo Pork",
          "price": "100",
          "description": "",
          "itemId": "15",
          "customizable": "0"
        }
      ]
    }
  ]
}

Необработанный ответ ниже:

массив (4) {[0] => массив (7) {["id"] => строка (2) "67" ["restaurant_id"] => строка (1) "5" ["category"] => string (11) "Основное блюдо" ["sub_category"] => строка (18) "Куриный тайский карри" ["price"] => строка (3) "599" ["description"] => строка (0) " "[" customizable "] => строка (1)" 1 "} [1] => массив (7) {[" id "] => строка (2)" 69 "[" restaurant_id "] => строка (1 ) "5" ["category"] => строка (12) "Закуски" ["sub_category"] => строка (18) "Kingfisher Premium" ["price"] => строка (3) "999" ["описание "] => строка (15)" Зимородок пиво "[" настраиваемый "] => строка (1)" 1 "} [2] => массив (7) {[" id "] => строка (2)" 68 "[" restaurant_id "] => строка (1)" 5 "[" category "] => строка (12)" Закуски "[" sub_category "] => строка (8)" Моктейль "[" цена "] => строка (3) "999" ["описание"] => строка (0) "" ["настраиваемая"] => строка (1) "1"} [3] => массив (7) {["id"] => строка (2) "66" ["restaurant_id"] => строка (1) "5" ["category"] => строка (13) "Рис бирийани" ["sub_category"] => строка (17) " Ризотто с дал макни "[" price "] => строка (3)" 499 "[" descr iption "] => строка (18)" Ризотто дал махни "[" настраиваемый "] => строка (1)" 1 "}}

Массивы начинаются с 0!

miron 07.11.2018 13:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
67
3

Ответы 3

Проблема в том, что когда вы добавляете элементы data, вам нужно добавлять их без конкретных ключей, поскольку вы добавляете их с помощью $i, как в ...

  $menuHead[$key]['data'][$i]['itemName']=$value['sub_category'];

Это перестанет быть обычным массивом, каким вы хотите его видеть. Для json_encode() массив должен начинаться с 0 и быть последовательным, чтобы он был массивом.

Вместо этого создайте их за один раз и добавьте в конец существующих данных с помощью [] ...

  $menuHead[$key]['data'][] = ['itemName' =>$value['sub_category'],
                  'price'=> $value['price'],
                  'description'=>$value['description'],
                  'itemId'=>$value['id'],
                  'customizable'=>$value['customizable']];

Это необходимо сделать с каждым набором аналогичного кода, который включает сам массив в целом, это можно сделать с помощью

$final['MenuList'] = array_values($menuHead);

Чтобы попытаться исправить данные, которые у вас уже есть, что означает никаких изменений, кроме добавления следующего кода ...

foreach ( $menuHead as $menu )  {
    $menu['data'] = array_values($menu['data']);
}
$final['MenuList'] = array_values($menuHead);

Это решение не сработало. Есть ли другой способ сделать это?

Debu 07.11.2018 13:16

Я добавил новый способ внизу ответа, он должен использоваться с вашим исходным кодом.

Nigel Ren 07.11.2018 13:26

Да, я поменял его в 3-х местах

Debu 07.11.2018 13:26

Вам может понадобиться $menuHead as &$menu, чтобы он мог обновлять исходные данные, посмотрите, поможет ли это.

Nigel Ren 07.11.2018 13:31

foreach ($ menuHead как $ menu) {$ menu ['data'] = array_values ​​($ menu ['data']); } $ final ['MenuList'] = значения_массива ($ menuHead); Добавил, но не получилось

Debu 07.11.2018 13:35

попробуйте с foreach ( $menuHead as &$menu ) (т.е. плюс &

Nigel Ren 07.11.2018 13:39

Это как-то сработало, но теперь я столкнулся с другой проблемой. Тот же заголовок меню содержит только 2 данных. пожалуйста проверьте скриншот prntscr.com/lgkznq

Debu 10.11.2018 08:23

Если вам нужен массив, совместимый с javascript, индекс должен начинаться с 0. Самый простой способ сделать это - использовать array_values():

$final['MenuList'] = array_values($menuHead);

Используйте array_values ​​();

Я исправил ваш код, он должен работать

    $menuHead=array(); 
    $i=0; 
    foreach($res as $key => $value){ 
        $i=$key+1;
        //$menuHead[$i]['menuHead']=$value['category'];
        if (isset($menuHead[$key]['menuHead'])){
            if ($menuHead[$key]['menuHead']==$value['category']){
              $menuHead[$key]['data'][$i]['itemName']=$value['sub_category'];
              $menuHead[$key]['data'][$i]['price']=$value['price'];
              $menuHead[$key]['data'][$i]['description']=$value['description'];
              $menuHead[$key]['data'][$i]['itemId']=$value['id'];
              $menuHead[$key]['data'][$i]['customizable']=$value['customizable'];
            }else{
              $menuHead[$i]['menuHead']=$value['category'];
              $menuHead[$i]['data'][$i]['itemName']=$value['sub_category'];  
              $menuHead[$i]['data'][$i]['price']=$value['price'];
              $menuHead[$i]['data'][$i]['description']=$value['description'];
              $menuHead[$i]['data'][$i]['itemId']=$value['id'];
              $menuHead[$i]['data'][$i]['customizable']=$value['customizable'];
            }
        }else{
          $menuHead[$i]['menuHead']=$value['category'];
          $menuHead[$i]['data'][$i]['itemName']=$value['sub_category'];  
          $menuHead[$i]['data'][$i]['price']=$value['price'];
          $menuHead[$i]['data'][$i]['description']=$value['description'];
          $menuHead[$i]['data'][$i]['itemId']=$value['id'];
          $menuHead[$i]['data'][$i]['customizable']=$value['customizable'];
        }    
    }
// i'am use array_values()
    $final['MenuList']= array_values($menuHead);
    echo json_encode($final);

Ваш код добавил массив в список меню, который отсутствовал в моем коде, но объект данных также должен быть массивом. Пожалуйста, помогите в этом

Debu 07.11.2018 13:15

$ final ['MenuList'] = (объект) array_values ​​($ menuHead)

Sergey B. 07.11.2018 13:17

Нет, это не сработало. объект data json также должен быть массивом

Debu 07.11.2018 13:21

Попробуй это. $ final ['MenuList'] [] = значения_массива ($ menuHead);

Sergey B. 07.11.2018 13:23

Другие вопросы по теме