Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
通过json的php foreach迭代_Php_Json_Foreach - Fatal编程技术网

通过json的php foreach迭代

通过json的php foreach迭代,php,json,foreach,Php,Json,Foreach,假设我从API获取了以下json响应 { "owner": "Jane Doe", "pets": [ { "color": "white", "type": "cat" }, { "color": "black", "type": "dog" } ] } 从下面的PHP代码中,我将json字符串转换为json对

假设我从API获取了以下json响应

{
    "owner": "Jane Doe",
    "pets": [
        {
            "color": "white",
            "type": "cat"
        },
        {
            "color": "black",
            "type": "dog"
        }
    ]
}
从下面的PHP代码中,我将json字符串转换为json对象。并显示宠物类型

$jsonObject = json_decode($json);

foreach($jsonObject->pets as $pets){
    echo 'Pet type:'.$pets->type.'</br>';
}
在上述情况下,php foreach迭代失败,并显示以下消息

*注意:尝试获取非对象的属性*


我正在寻找一种简单的方法来实现这一点,因为我正在处理的实际json响应有很多这样的情况。

您需要检查
$jsonObject->pets
是否是数组或对象。如果它是一个对象,用包含该对象的数组替换它,那么循环将工作

if (!is_array($jsonObject->pets)) {
    $jsonObject->pets = array($jsonObject->pets);
}
您还可以在
foreach
中使用条件:

foreach (is_array($jsonObject->pets) ? $jsonObject->pets : [jsonObject->pets] as $pet) {
    ...
}
如果您不想每次都写这些内容,可以将其放在函数中:

function as_array($x) {
    return is_array($x) ? $x : [x];
}
然后使用:

foreach (as_array($jsonObject->pets) as $pet) {
    ...
}

我也会向API设计师投诉。返回这样不一致的数据格式是荒谬的。

出于某种原因,他不想使用Is_array()任何推理运算?那么,这是最简单的方法吗?那么,这似乎是最好的方法。很抱歉,我想对此表示怀疑。为什么说
呢?因此,提供一个解决方案来访问上述json响应中的变量,而不使用
?为什么不能使用if语句呢?我正在寻找一种简单的方法来实现这一点,因为我正在处理的实际json响应有很多这样的情况。检查某个东西是否是数组的最简单方法是使用if语句和is_数组。如果你需要做很多事情,把它放在函数中。
foreach (as_array($jsonObject->pets) as $pet) {
    ...
}