【问题标题】:Failed to extract array data so inside of the loop body无法在循环体内提取数组数据
【发布时间】:2022-11-14 07:20:51
【问题描述】:

我需要遍历一个多维数组并提取所有数据:

PHP代码:

//Loads the data and transforms it into an array
$json_data = json_decode(file_get_contents('data.json'));

//Loops through the array and returns the values
echo '<br>'.'Modal: ' .$json_data->list[0]->mode;
echo '<br>'.'Variation: ' .$json_data->list[0]->change;
foreach ($json_data->list[0]->expiry as $data) {
        echo '<br>'.'Due date: ' .$data->cdexpiry;
        echo '<br>'.'Value: ' .$data->vlexpiry;
}

JSON数据:

{
    "list": [
        {
            "expiry": [
                {
                    "cdexpiry": "v130",
                    "vlexpiry": "33528.99"
                },
                {
                    "cdexpiry": "v230",
                    "vlexpiry": "21648.39"
                },
                {
                    "cdexpiry": "v150",
                    "vlexpiry": "185350.30"
                }
            ],
            "mode": "0401",
            "change": "N"
        },
        {
            "expiry": {
                "cdexpiry": "v40",
                "vlexpiry": "1091.46"
            },
            "mode": "1904",
            "change": "N"
        },
        {
            "expiry": {
                "cdexpiry": "v770",
                "vlexpiry": "1001.56"
            },
            "mode": "1904",
            "change": "N"
        },
        {
            "expiry": [
                {
                    "cdexpiry": "v130",
                    "vlexpiry": "2084.08"
                },
                {
                    "cdexpiry": "v260",
                    "vlexpiry": "28362.31"
                }
            ],
            "mode": "0213",
            "change": "N"
        },
        {
            "expiry": {
                "cdexpiry": "v210",
                "vlexpiry": "296.78"
            },
            "mode": "0101",
            "change": "N"
        },
        {
            "expiry": [
                {
                    "cdexpiry": "v245",
                    "vlexpiry": "1495.37"
                },
                {
                    "cdexpiry": "v248",
                    "vlexpiry": "1440.37"
                }
            ],
            "mode": "0217",
            "change": "N"
        }
    ],
    "type": "8"
}

我已经使用了一些 for's 和 if's - 但我遗漏了一些东西。

for ($i = 0; $i < count($json_data->list); $i++) {
if(isset($json_data->list[$i]->expiry))

期望的结果

Type Value
Modal 0401
Variation N
Due date v130
Value 33528.99
Due date v230
Value 21648.39
Due date v150
Value 185350.30
--- ---
Modal 1904
Variation N
Due date V40
Value 1091.46
Due date v770
Value 1001.56
--- ---
Modal 0213
Variation N
Due date v130
Value 2084.08
Due date v260
Value 28362.31
--- ---
Modal 0101
Variation N
Due date V210
Value 296.78
--- ---
Modal 0217
Variation N
Due date V245
Value 1495.37
Due date V248
Value 1440.37

我需要从数组中提取所有数据以便以后能够对其进行操作。我指望大师们的帮助!

【问题讨论】:

  • 你忘了说你实际的具体问题是什么......
  • 是的,我做到了,我无法通过数组内的 foreach 循环,因此我无法提取要处理的数据。如果 foreach 试图访问 list[1] 指针对象,它会返回一个错误。 foreach 函数只能从数组 0 和 5 加载数据...
  • 什么那会是错误吗?
  • 该 JSON 具有不规则的结构。确定这是您收到的实际数据吗? expiry 有时是一个数组,有时是一个对象。很奇怪。
  • 是的,我同意,这让我睡不着觉。

标签: php arrays json multidimensional-array


【解决方案1】:

该 JSON 具有不规则的结构。确定这是您收到的实际数据吗? expiry 有时是一个数组,有时是一个对象。很奇怪。

看一下这个例子来了解如何遍历它:

<?php
$json = <<<JSON
{"list":[{"expiry":[{"cdexpiry":"v130","vlexpiry":"33528.99"},{"cdexpiry":"v230","vlexpiry":"21648.39"},{"cdexpiry":"v150","vlexpiry":"185350.30"},{"cdexpiry":"v120","vlexpiry":"33904.03"},{"cdexpiry":"v175","vlexpiry":"47796.73"},{"cdexpiry":"v220","vlexpiry":"21258.62"},{"cdexpiry":"v170","vlexpiry":"261294.42"},{"cdexpiry":"v140","vlexpiry":"98363.25"},{"cdexpiry":"v110","vlexpiry":"30818.43"},{"cdexpiry":"v165","vlexpiry":"298457.07"},{"cdexpiry":"v240","vlexpiry":"13807.67"},{"cdexpiry":"v210","vlexpiry":"10761.00"},{"cdexpiry":"v160","vlexpiry":"321684.92"}],"mode":"0401","change":"N"},{"expiry":{"cdexpiry":"v210","vlexpiry":"3501.37"},"mode":"0204","change":"N"},{"expiry":{"cdexpiry":"v40","vlexpiry":"1091.46"},"mode":"1904","change":"N"},{"expiry":[{"cdexpiry":"v130","vlexpiry":"2084.08"},{"cdexpiry":"v260","vlexpiry":"28362.31"},{"cdexpiry":"v230","vlexpiry":"823.44"},{"cdexpiry":"v150","vlexpiry":"11738.63"},{"cdexpiry":"v120","vlexpiry":"2104.49"},{"cdexpiry":"v175","vlexpiry":"2678.84"},{"cdexpiry":"v220","vlexpiry":"823.44"},{"cdexpiry":"v170","vlexpiry":"17207.36"},{"cdexpiry":"v140","vlexpiry":"6131.73"},{"cdexpiry":"v110","vlexpiry":"1605.88"},{"cdexpiry":"v165","vlexpiry":"19333.84"},{"cdexpiry":"v210","vlexpiry":"3260.41"},{"cdexpiry":"v160","vlexpiry":"19818.10"}],"mode":"0213","change":"N"},{"expiry":{"cdexpiry":"v210","vlexpiry":"296.78"},"mode":"0101","change":"N"},{"expiry":[{"cdexpiry":"v245","vlexpiry":"14495.37"},{"cdexpiry":"v255","vlexpiry":"35462.84"},{"cdexpiry":"v250","vlexpiry":"15679.97"}],"mode":"0217","change":"N"}],"type":"8"}
JSON;

foreach (json_decode($json)->list as $listKey=>$listObj) {
    printf("[%03d] mode: %s / change: %s
", $listKey, $listObj->mode, $listObj->change);
    if (is_array($listObj->expiry)) {
        foreach ($listObj->expiry as $expKey=>$obj) {
            printf("  [%03d] cdexpiry: %s / vlexpiry: %s
", 
                   $expKey, $obj->cdexpiry, $obj->vlexpiry);
        }
    } else {
        $obj = $listObj->expiry;
        printf("  cdexpiry: %s / vlexpiry: %s
", $obj->cdexpiry, $obj->vlexpiry);        
    }
}

输出是:

[000] mode: 0401 / change: N
  [000] cdexpiry: v130 / vlexpiry: 33528.99
  [001] cdexpiry: v230 / vlexpiry: 21648.39
  [002] cdexpiry: v150 / vlexpiry: 185350.30
  [003] cdexpiry: v120 / vlexpiry: 33904.03
  [004] cdexpiry: v175 / vlexpiry: 47796.73
  [005] cdexpiry: v220 / vlexpiry: 21258.62
  [006] cdexpiry: v170 / vlexpiry: 261294.42
  [007] cdexpiry: v140 / vlexpiry: 98363.25
  [008] cdexpiry: v110 / vlexpiry: 30818.43
  [009] cdexpiry: v165 / vlexpiry: 298457.07
  [010] cdexpiry: v240 / vlexpiry: 13807.67
  [011] cdexpiry: v210 / vlexpiry: 10761.00
  [012] cdexpiry: v160 / vlexpiry: 321684.92
[001] mode: 0204 / change: N
  cdexpiry: v210 / vlexpiry: 3501.37
[002] mode: 1904 / change: N
  cdexpiry: v40 / vlexpiry: 1091.46
[003] mode: 0213 / change: N
  [000] cdexpiry: v130 / vlexpiry: 2084.08
  [001] cdexpiry: v260 / vlexpiry: 28362.31
  [002] cdexpiry: v230 / vlexpiry: 823.44
  [003] cdexpiry: v150 / vlexpiry: 11738.63
  [004] cdexpiry: v120 / vlexpiry: 2104.49
  [005] cdexpiry: v175 / vlexpiry: 2678.84
  [006] cdexpiry: v220 / vlexpiry: 823.44
  [007] cdexpiry: v170 / vlexpiry: 17207.36
  [008] cdexpiry: v140 / vlexpiry: 6131.73
  [009] cdexpiry: v110 / vlexpiry: 1605.88
  [010] cdexpiry: v165 / vlexpiry: 19333.84
  [011] cdexpiry: v210 / vlexpiry: 3260.41
  [012] cdexpiry: v160 / vlexpiry: 19818.10
[004] mode: 0101 / change: N
  cdexpiry: v210 / vlexpiry: 296.78
[005] mode: 0217 / change: N
  [000] cdexpiry: v245 / vlexpiry: 14495.37
  [001] cdexpiry: v255 / vlexpiry: 35462.84
  [002] cdexpiry: v250 / vlexpiry: 15679.97

考虑到您收到的 JSON 数据的奇怪结构,我真的建议尝试修复该结构,而不是尝试使用该结构。 JSON 数据中出乎意料的变化格式使其处理起来不必要地复杂。我看不出有什么原因。 API 响应中的对象应该总是具有严格统一的结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多