извлечение имен категорий в формате json

#php #json

#php #json

Вопрос:

Я пытаюсь получить имена категорий, которые поставляются с Json. Эта категория распадается с добавлением. По этой причине мне нужно получать имена категорий в цикле.

JSON

 [
        {
            "GUID": "d8fced8f-f751-43a8-a94f-18c613869d29",
            "Code": "100101",
            "MainUnit": "12",
            "ProductCategory": {
                "ID": 263,
                "Name": "Category 5",
                "MainCategory": false,
                "ParentCategoryID": 262,
                "ParentCategory": {
                    "ID": 262,
                    "Name": "Category 4",
                    "MainCategory": false,
                    "ParentCategoryID": 153,
                    "ParentCategory": {
                        "ID": 153,
                        "Name": "Category 3",
                        "MainCategory": false,
                        "ParentCategoryID": 152,
                        "ParentCategory": {
                            "ID": 152,
                            "Name": "Category 2",
                            "MainCategory": false,
                            "ParentCategoryID": 2,
                            "ParentCategory": {
                                "ID": 2,
                                "Name": "Category 1",
                                "MainCategory": true,
                                "ParentCategory": null,
                                "ParentCategoryID": 0
                            }
                        }
                    }
                }
            },
            "Brand": ""
        }
    ]
 

CURL

 $curl = curl_init();
      curl_setopt_array($curl, array(
      CURLOPT_URL => 'http://example.com/json/products',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => '',
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => 'GET',
      CURLOPT_HTTPHEADER => array(
        'Content-Type: application/json',
        'Accept: application/json',
        'Authorization: Bearer gd6yaw7gjiLQ8VeytrpLrl9'
      ),
    ));
    $response = curl_exec($curl);
    curl_close($curl);
    $response = json_decode($response);

    foreach($response as $return){
    
        function displayRecursiveResults($arrayObject) {
            foreach($arrayObject as $key=>$data) {
                if(is_array($data)) {
                    displayRecursiveResults($data);
                } elseif(is_object($data)) {
                    displayRecursiveResults($data);
                } else {
                    echo $data.'<br />';
                }
            }
        }
        displayRecursiveResults($return->ProductCategory);
        
    }
 

Внутри функции displayRecursiveResults я создал цикл для получения категорий. В этом цикле используются не только имена категорий, но и другие параметры.

Вывод:

 263
Category 5
262
262
Category 4
153
153
Category 3
152
152
Category 2
2
2
Category 1
1
0
 

я хочу напечатать так: Категория 5-> Категория 4-> Категория 3-> Категория 2-> Категория 1

Комментарии:

1. Некоторое представление о структуре JSON, с которой вы пытаетесь работать, облегчило бы ответ.

2. @NigelRen да, я пропустил это, я добавил сейчас

Ответ №1:

То, что вы пытаетесь сделать, называется breadcrumbs .

Я написал короткую функцию, которая делает то, что вам нужно. Просто используйте это в своем коде, и панировочные сухари должны работать.

 <?php

$json = '{"GUID": "d8fced8f-f751-43a8-a94f-18c613869d29",
            "Code": "100101",
            "MainUnit": "12",
            "ProductCategory": {
                "ID": 263,
                "Name": "Category 5",
                "MainCategory": false,
                "ParentCategoryID": 262,
                "ParentCategory": {
                    "ID": 262,
                    "Name": "Category 4",
                    "MainCategory": false,
                    "ParentCategoryID": 153,
                    "ParentCategory": {
                        "ID": 153,
                        "Name": "Category 3",
                        "MainCategory": false,
                        "ParentCategoryID": 152,
                        "ParentCategory": {
                            "ID": 152,
                            "Name": "Category 2",
                            "MainCategory": false,
                            "ParentCategoryID": 2,
                            "ParentCategory": {
                                "ID": 2,
                                "Name": "Category 1",
                                "MainCategory": true,
                                "ParentCategory": null,
                                "ParentCategoryID": 0
                            }
                        }
                    }
                }
            },
            "Brand": ""
        }';

echo createBreadcrumbs(json_decode($json, true));

function createBreadcrumbs(array $product): string
{
    // Check if the product has a category
    $categories = isset($product['ProductCategory']) ? $product['ProductCategory'] : [];

    $breadcrumbs = empty($categories) ? '' : $categories['Name'];

    while (isset($categories['ParentCategory'])) {
        $categories = $categories['ParentCategory'];
        $breadcrumbs .= '->' . $categories['Name'];
    }

    return $breadcrumbs;
}
 

Модифицированная функция, которая возвращает массив категорий:

 // Array with all category names of the product
$productCategories = createBreadcrumbs(json_decode($json, true));
print_r($productCategories);

function createBreadcrumbs(array $product): array
{
    // Check if the product has a category
    $categories = isset($product['ProductCategory']) ? $product['ProductCategory'] : [];

    $breadcrumbs = empty($categories) ? [] : [$categories['Name']];

    while (isset($categories['ParentCategory'])) {
        $categories = $categories['ParentCategory'];
        array_push($breadcrumbs, $categories['Name']);
    }

    return $breadcrumbs;
}
 

Комментарии:

1. К сожалению, это не сработало, мне нужно создать структуру, подобную приведенному выше примеру. Он выдал ошибку. Неустранимая ошибка: неперехваченная ошибка типа: аргумент 1, переданный createBreadcrumbs(), должен иметь тип array, object given, вызываемый в

2. @codefile вы вызывали функцию, как я, со вторым параметром в json_decode (true)? Потому что функция createBreadcrumbs требует массива в качестве параметра. Когда вы вызываете json_decode только с одним параметром, он возвращает объект вместо массива.

3. echo createBreadcrumbs(json_decode($response, true));

4. Теперь это так, большое вам спасибо. Я допустил ошибку.

5. Последний вопрос: я должен распечатать эти категории в базе данных. Как я могу сохранить каждую категорию по отдельности? prnt.sc/z3p7hl