Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php foreach在json对象上工作不正常_Php_Json_Parsing_Loops_Stdclass - Fatal编程技术网

php foreach在json对象上工作不正常

php foreach在json对象上工作不正常,php,json,parsing,loops,stdclass,Php,Json,Parsing,Loops,Stdclass,这个线程讨论是这样做还是那样做。事实是,如果没有另一个,其中一个是不够的。解决方案(以及对问题的更清晰描述)可在以下位置找到: 我将以下JSON解析为对象(stdClass): 在XML中也是如此,可读性更强,在我的var_dump中还不能很好地打印JSON <getdeparturesresult> <departuresegment> <departure> <location id="746101

这个线程讨论是这样做还是那样做。事实是,如果没有另一个,其中一个是不够的。解决方案(以及对问题的更清晰描述)可在以下位置找到:


我将以下JSON解析为对象(stdClass):

在XML中也是如此,可读性更强,在我的var_dump中还不能很好地打印JSON

<getdeparturesresult>
    <departuresegment>
        <departure>
            <location id="7461018" x="12.523958" y="57.938402">
                <name>Noltorps centrum</name>
            </location>
            <datetime>2014-12-04 23:05</datetime>
        </departure>
        <direction>Alingsås station</direction>
        <segmentid>
            <mot displaytype="B" type="BLT">Buss</mot>
            <carrier>
                    <name>Västtrafik</name>
                    <url>http://www.vasttrafik.se/</url>
                <id>279</id>
                <number>1</number>
            </carrier>
        </segmentid>
    </departuresegment>
</getdeparturesresult>
…它工作得很好,直到我得到这样一个响应,其中只有一个离开元素,在这种情况下,我会被抛出以下错误:

(http500) Notice: Undefined property: stdClass::$departure
因此,在我看来,循环尝试第二次运行,在第二次运行中,它在第一行失败

$r[$i]["depTime"] = $m->departure->datetime; //tid för avgången
因为$m->离开不存在。但为什么百万美元会存在呢

-----更新-------

这就是当DEPARTURESEGMENT中有多个项目时JSON的外观:

{
  "getdeparturesresult":{
     "departuresegment":[{
        "departure":{
           "location":{
              "@id":"7461018",
              "@x":"12.523958",
              "@y":"57.938402",
              "name":"Noltorps centrum"
           },
           "datetime":"2014-12-04 23:05"
        },
        "direction":"Alingsås station",
        "segmentid":{
           "mot":{
              "@displaytype":"B",
              "@type":"BLT",
              "#text":"Buss"
           },
           "carrier":{
              "name":"Västtrafik",
              "url":"http://www.vasttrafik.se/",
              "id":"279",
              "number":"1"
           }
        }
     },
     {
        "departure":{
           "location":{
              "@id":"7461018",
              "@x":"12.523958",
              "@y":"57.938402",
              "name":"Noltorps centrum"
           },
           "datetime":"2014-12-04 23:05"
        },
        "direction":"Alingsås station",
        "segmentid":{
           "mot":{
              "@displaytype":"B",
              "@type":"BLT",
              "#text":"Buss"
           },
           "carrier":{
              "name":"Västtrafik",
              "url":"http://www.vasttrafik.se/",
              "id":"279",
              "number":"1"
           }
        }
     }
     ]
  }
}
在这种情况下,我的循环工作正常。但当只有一个项目时,我需要一个类似@chillinuts的循环,在foreach条件下,循环要浅一层

有没有一种方法可以编写一个循环,如果是数组,它将在DEPARTURESEGMENT中的对象数组上迭代,如果不是,则只从第一个对象中提取值?我是否必须在循环之前放置一个单独的if子句来测试循环是否确实是必要的(从而在逻辑上加倍以获取我想要的值,无论是在循环内还是在循环外)?

$m
偏离
。您正在循环通过
部门段的每个元素。所以首先,
$m
出发
,然后是它的
方向
,然后是它的
段ID
。你可能只是想

foreach($apiData->getdeparturesresult->departuresegment作为$m)

测试

$json = '{"getdeparturesresult":{"departuresegment":{"departure":{"location":{"@id":"7461018","@x":"12.523958","@y":"57.938402","name":"Noltorps centrum"},"datetime":"2014-12-04 23:05"},"direction":"Alingsås station","segmentid":{"mot":{"@displaytype":"B","@type":"BLT","#text":"Buss"},"carrier":{"name":"Västtrafik","url":"http:\/\/www.vasttrafik.se\/","id":"279","number":"1"}}}}}';
$apiData = json_decode($json);
foreach ($apiData->getdeparturesresult->departuresegment as $key => $m) {
    echo "key:" . $key . "\r\n";
    echo '$m:' . print_r($m, true);
    echo "\r\n";
}
key:departure
$m:stdClass Object
(
    [location] => stdClass Object
        (
            [@id] => 7461018
            [@x] => 12.523958
            [@y] => 57.938402
            [name] => Noltorps centrum
        )

    [datetime] => 2014-12-04 23:05
)

key:direction
$m:Alingsås station
key:segmentid
$m:stdClass Object
(
    [mot] => stdClass Object
        (
            [@displaytype] => B
            [@type] => BLT
            [#text] => Buss
        )

    [carrier] => stdClass Object
        (
            [name] => Västtrafik
            [url] => http://www.vasttrafik.se/
            [id] => 279
            [number] => 1
        )

)
输出

$json = '{"getdeparturesresult":{"departuresegment":{"departure":{"location":{"@id":"7461018","@x":"12.523958","@y":"57.938402","name":"Noltorps centrum"},"datetime":"2014-12-04 23:05"},"direction":"Alingsås station","segmentid":{"mot":{"@displaytype":"B","@type":"BLT","#text":"Buss"},"carrier":{"name":"Västtrafik","url":"http:\/\/www.vasttrafik.se\/","id":"279","number":"1"}}}}}';
$apiData = json_decode($json);
foreach ($apiData->getdeparturesresult->departuresegment as $key => $m) {
    echo "key:" . $key . "\r\n";
    echo '$m:' . print_r($m, true);
    echo "\r\n";
}
key:departure
$m:stdClass Object
(
    [location] => stdClass Object
        (
            [@id] => 7461018
            [@x] => 12.523958
            [@y] => 57.938402
            [name] => Noltorps centrum
        )

    [datetime] => 2014-12-04 23:05
)

key:direction
$m:Alingsås station
key:segmentid
$m:stdClass Object
(
    [mot] => stdClass Object
        (
            [@displaytype] => B
            [@type] => BLT
            [#text] => Buss
        )

    [carrier] => stdClass Object
        (
            [name] => Västtrafik
            [url] => http://www.vasttrafik.se/
            [id] => 279
            [number] => 1
        )

)

只有第一个有datetime…

但是为什么$m本身也会存在呢?
它会检查对象的属性。看看,你会明白的。是的,但它应该经过离境部分,对吗?这其中只有一个。循环将通过
出发
方向
等等。因此,
$m
将不会包含
离开
,因为在第一个循环中,它将已经是
离开
,如果总是设置离开段
$m
默认情况下是空的stdclass,如果您在其上放置项目,如果有多个元素,它将成为一个数组,如果没有,这是一个stdclass-由于您的错误显示离开元素不存在,那么整个
$apiData->getdeparturesresult->departuresegment
元素的内容是什么无论如何,如果您的元素是stdclass,您可以在foreach循环之前检查,否则设置
$apiData->getdeparturesresult->departuresegment=array($apiData->getdeparturesresult->departuresegment)
不,这不是问题,答案中的多个元素都可以正常工作。我并不在所有子元素中寻找depTime,我只从department元素中选择depTime(参见循环中的代码)。我不是迭代离开元素/属性,而是迭代它的父元素/属性DEPARTURESEGMENT@MattiasSvensson:您的意思是当您只有一个出发点时,您的json看起来是这样的:{“getdeparturesresult”:{“出发点”:…}?请查看编辑,它看起来您的循环没有达到预期的效果否,如果$m本来是deposition,那么每次在循环的第一行它都会失败,因为$m beposition永远不会有一个名为deposition的子属性。正如我所说,只要有一个以上的departuresegment元素,它就可以正常工作。@anhlc否,结构仍然相同,当只有一个departuresegment(departition、direction和segmentid的父元素)时,问题就出现了。