【问题标题】:pulling json category names提取 json 类别名称
【发布时间】:2021-02-11 10:53:17
【问题描述】:

我正在尝试获取 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_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

我想这样打印:Category 5->Category 4->Category 3->Category 2->Category 1

【问题讨论】:

  • 对您尝试使用的 JSON 结构的一些想法会使答案更容易。
  • @NigelRen 是的,我错过了,我现在添加了

标签: php json


【解决方案1】:

您尝试执行的操作称为面包屑。

我写了一个简短的函数来满足你的需要。只需在您的代码中使用它,面包屑就可以工作了。

<?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;
}

【讨论】:

  • 不幸的是它不起作用,我需要像上面给出的示例一样创建一个结构。他给出了一个错误。致命错误:未捕获的类型错误:传递给 createBreadcrumbs() 的参数 1 必须是数组类型,给定对象,在中调用
  • @codefile 您是否像我在 json_decode (true) 中使用第二个参数那样调用该函数?因为 createBreadcrumbs 函数需要一个数组作为参数。当你只用一个参数调用 json_decode 时,它​​会返回一个对象而不是一个数组。
  • echo createBreadcrumbs(json_decode($response, true));
  • 现在是,非常感谢。我犯了一个错误。
  • 最后一个问题:我必须将这些类别打印到数据库中。如何单独保存每个类别? prnt.sc/z3p7hl
猜你喜欢
  • 2017-12-24
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2016-06-25
  • 2017-08-02
相关资源
最近更新 更多