Как форматировать ключевые/метаданные объекта JSON в PHP

Учитывая следующий фрагмент кода:

<?php
require "db_conn.php";

$sql = "SELECT category,product_code,product_name,unit,quantity FROM items INNER JOIN categories ON items.category_id=categories.id";

$res = $conn->query($sql)->fetchAll();

$structured = [];

if ($res) {

     foreach ($res as $key => $row)
     {
        $structured[$row['category']]['items'][] = [
           'product_code' => $row['product_code'],
           'product_name' => $row['product_name'],
           'unit' => $row['unit'],
           'quantity' => $row['quantity'],
        ];

     }

     echo json_encode([$structured]);
}

выводит следующий ответ JSON:

[{
"BABY ITEMS": {
    "items": [{
        "product_code": "151128",
        "product_name": "BOUNCY BABY WIPES 80'S",
        "unit": "CARTON",
        "quantity": "5.00"
    }]
},
"CONFECTIONS/PASTRIES": {
    "items": [{
        "product_code": "130570",
        "product_name": "NUVITA FAMILY 75G",
        "unit": "CARTON",
        "quantity": "1.00"
    }, {
        "product_code": "115165",
        "product_name": "NUVITA MAGIK LEMON CRM 60*2'S",
        "unit": "CARTON",
        "quantity": "2.00"
    }]
},
"HOUSEHOLD ITEMS": {
    "items": [{
        "product_code": "150278",
        "product_name": "BOUNCY BABY DIAPER 10'S MINI",
        "unit": "CARTON",
        "quantity": "1.00"
    }]
}

}]

Как изменить эту часть кода:

$structured[$row['category']]['items'][]

для вывода:

"category": "BABY ITEMS",

вместо:

"BABY ITEMS":

Ожидаемый JSON (от руки):

[{
        "category": "BABY ITEMS",
        "items": [{
            "product_code": "151128",
            "product_name": "BOUNCY BABY WIPES 80'S",
            "unit": "CARTON",
            "quantity": "5.00"
        }]
    },
    {
        "category": "CONFECTIONS/PASTRIES",
        "items": [{
                "product_code": "130570",
                "product_name": "NUVITA FAMILY 75G",
                "unit": "CARTON",
                "quantity": "1.00"
            },
            {
                "product_code": "115165",
                "product_name": "NUVITA MAGIK LEMON CRM 60*2'S",
                "unit": "CARTON",
                "quantity": "3.00"
            },
            {
                "product_code": "115160",
                "product_name": "NUVITA MAGIK S.BERRY CRM 60*2'S",
                "unit": "CARTON",
                "quantity": "2.00"
            }
        ]
    },
    {
        "category": "HOUSEHOLD ITEMS",
        "items": [{
            "product_code": "150278",
            "product_name": "BOUNCY BABY DIAPER 10'S MINI",
            "unit": "CARTON",
            "quantity": "1.00"
        }]
    },
    {
        "category": "PERSONAL CARE",
        "items": [{
            "product_code": "160200",
            "product_name": "ALL TYME ULTRA REGULAR 8'S",
            "unit": "CARTON",
            "quantity": "2.00"
        },
        {
            "product_code": "160309",
            "product_name": "ALL TYME ULTRA MEDIUM 8'S",
            "unit": "CARTON",
            "quantity": "4.00"
        },
        {
            "product_code": "160235",
            "product_name": "GOLDEN SHOE POLSIH 50ML BLACK",
            "unit": "CARTON",
            "quantity": "1.00"
        },
        {
            "product_code": "190251",
            "product_name": "ALL TYME ULTRA MEDIUM 16'S",
            "unit": "CARTON",
            "quantity": "2.00"
        }]
    }
]

Мне действительно нужен формат JSON, как указано выше, поскольку я использую его для создания вложенной категории и элементов RecyclerView. Вот как я разбираю в Android Java:

 for (int i = 0; i < jsonArray.length(); i++) {
   JSONObject objCategory = jsonArray.getJSONObject(i);

   System.out.println("Category: " + objCategory.getString("category"));

   // fetch item details and store it in arraylists
   JSONArray itemArray = objCategory.getJSONArray("items");
   //System.out.println("Item length: " + itemArray.length());

   ParentItem category = new 
   ParentItem(objCategory.getString("category"),OrderItemsList(itemArray));
   orderFetchingList.add(category);

}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

См. следующий код (полностью функциональный). Я издевался над $res несколькими записями и скопировал ваш код, чтобы заполнить $structured. Ниже, пожалуйста, найдите мой код для реструктуризации данных, чтобы получить желаемый результат JSON.

$res = [
    [
        'category' => 'BABY',
        'product_code' => '123',
        'product_name' => 'BABY STUFF',
        'unit' => 1,
        'quantity' => 999,
    ],
    [
        'category' => 'BABY',
        'product_code' => '125',
        'product_name' => 'BABY EAT',
        'unit' => 1,
        'quantity' => 999,
    ],
    [
        'category' => 'MEN',
        'product_code' => '124',
        'product_name' => 'MEN STUFF',
        'unit' => 2,
        'quantity' => 888,
    ]
];


echo '<pre>';
$structured = [];

foreach($res as $key => $row) {
    $structured[$row['category']]['items'][] = [
       'product_code' => $row['product_code'],
       'product_name' => $row['product_name'],
       'unit' => $row['unit'],
       'quantity' => $row['quantity'],
    ];
}

print_r($structured);

// restructure the data to get the desired JSON output
$collection = [];
foreach($structured as $category => $items) {
    $collection[] = [
        'category' => $category,
        'items' => $items['items']
    ];
}

echo json_encode($collection);

Выход (JSON):

[
    {
        "category": "BABY",
        "items": [
            {
                "product_code": "123",
                "product_name": "BABY STUFF",
                "unit": 1,
                "quantity": 999
            },
            {
                "product_code": "125",
                "product_name": "BABY EAT",
                "unit": 1,
                "quantity": 999
            }
        ]
    },
    {
        "category": "MEN",
        "items": [
            {
                "product_code": "124",
                "product_name": "MEN STUFF",
                "unit": 2,
                "quantity": 888
            }
        ]
    }
]

Не могли бы вы принять ответ?

Honk der Hase 10.05.2022 16:53

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