json 无法提取循环体内部的数组数据

yx2lnoni  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(102)

我需要遍历一个多维数组并提取所有数据:
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 ($i = 0; $i < count($json_data->list); $i++) {
if(isset($json_data->list[$i]->expiry))

预期结果

|类型| 数值|
| - -|- -|
|莫代尔|0401|
|变化||
| 到期日|第130节|
| 数值|小行星33528.99|
| 到期日|第二百三十节|
| 数值|小行星21648.39|
| 到期日|第150章|
| 数值|185,350.30欧元|
|************************************************************************************|************************************************************************************|
|莫代尔|一九〇四年|
|变化||
| 到期日|第四十章|
| 数值|一千零九十一点四六|
| 到期日|v770版本|
| 数值|一千零一点五六|
|************************************************************************************|************************************************************************************|
|莫代尔|0213|
|变化||
| 到期日|第130节|
| 数值|小行星2084.08|
| 到期日|第二百六十章|
| 数值|小行星28362.31|
|************************************************************************************|************************************************************************************|
|莫代尔|0101|
|变化||
| 到期日|第210节|
| 数值|二百九十六点七八|
|************************************************************************************|************************************************************************************|
|莫代尔|0217|
|变化||
| 到期日|小行星245|
| 数值|一千四百九十五点三七|
| 到期日|小行星248|
| 数值|一千四百四十点三七|

“我需要将阵法中的所有数据都提取出来,以便以后进行操作,还请大师们帮忙!”

2uluyalo

2uluyalo1#

不幸的是,您有一个不一致的数组结构,因此不仅需要编写循环来访问每一层,还需要编写一个条件来适应偏离的子集结构。
代码:(Demo单击眼睛图标以呈现html输出)

$json_data = json_decode($json);
echo "<table border=1>\n";
    echo "\t<tr><td>Type</td><td>Value</td></tr>\n";
    foreach ($json_data->list as $list) {
        echo "\t<tr><td>Modal</td><td>{$list->mode}</td></tr>\n";
        echo "\t<tr><td>Variation</td><td>{$list->change}</td></tr>\n";
        foreach ($list as $key => $data) {
            if ($key === 'expiry') {
                if (is_array($data)) {
                    foreach ($data as $prop) {
                        echo "\t<tr><td>Due date</td><td>$prop->cdexpiry</td></tr>\n";
                        echo "\t<tr><td>Value</td><td>$prop->vlexpiry</td></tr>\n";
                    }
                } else {
                    echo "\t<tr><td>Due date</td><td>$data->cdexpiry</td></tr>\n";
                    echo "\t<tr><td>Value</td><td>$data->vlexpiry</td></tr>\n";
                }
            }
        }
        echo "\t<tr><td>---</td><td>---</td></tr>\n";
    }
echo "</table>";
lh80um4z

lh80um4z2#

那个 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\n", $listKey, $listObj->mode, $listObj->change);
    if (is_array($listObj->expiry)) {
        foreach ($listObj->expiry as $expKey=>$obj) {
            printf("  [%03d] cdexpiry: %s / vlexpiry: %s\n", 
                   $expKey, $obj->cdexpiry, $obj->vlexpiry);
        }
    } else {
        $obj = $listObj->expiry;
        printf("  cdexpiry: %s / vlexpiry: %s\n", $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 响应 中 的 对象 应该 * 总是 * 具有 严格 和 统一 的 结构 。

相关问题