php foreach通过json迭代

时间:2018-03-29 20:04:12

标签: php json foreach

假设我从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>';
}

但是在某些情况下,来自API的响应json采用以下格式

{
    "owner": "John Doe",
    "pets": {
        "color": "white",
        "type": "cat"
    }
}

在这种情况下,上面的php foreach迭代失败并显示以下消息

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

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

1 个答案:

答案 0 :(得分:7)

您需要检查$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设计师抱怨。返回不一致的数据格式是荒谬的。