检查数组中对象的属性是否存在

时间:2017-07-12 21:56:09

标签: php

我找回了JSON,它将多个对象作为数组的值。

我需要检测JSON中的“Error”属性是否返回,但是Error属性不存在的可能性我不希望出现错误。

这是我得到的解码JSON。 JSON可以这样回来,但它可能不会:

JSON

[{"Error":"1050"}]

我的PHP

$data = json_decode($json); 
print_r($data); 

返回:

Array
(
    [0] => stdClass Object
        (
            [Error] => 1050
        )

)

4 个答案:

答案 0 :(得分:2)

我认为,对于您的具体示例,您可以使用$arr[0]->Error访问错误,但json_decode中的关联选项意味着它取决于您json_decode要求的内容。

这意味着如果您执行$arr = json_decode($json, true),那么您将使用$arr[0]['Error']访问错误,因为JSON将始终将对象解码为关联数组。

这是使用JSON和PHP进行变异和混淆的可爱示例,您可能从PHP中的关联数组开始,将其转换为JSON并返回并丢失关联数组。只是值得关注的事情。

在PHP中,您可以访问带有[方括号]的数组和带有->箭头的对象属性。它们不像JavaScript中的括号和点符号那样可互换。因此,您始终需要注意数据结构是对象还是关联数组。

至于测试是否存在该属性,请使用isset

if(isset($arr[0]->Error)) {
  // handle error
}

现在,我真的讨厌在任何地方使用isset,所以我有一个实用功能:

function getProperty($object, $propertyName, $defaultValue = false)
{
    $returnValue = $defaultValue;

    if (!empty($object)) {
        if (is_array($object)) {
            if (isset($object[$propertyName])) {
                $returnValue = $object[$propertyName];
            }
        } else {
            if (isset($object->$propertyName)) {
                $returnValue = $object->$propertyName;
            }
        }
    }

    return $returnValue;
}

在我的代码中,我的意思是:

if(($error = getProperty($arr[0], 'Error')) === false) {
    // process $error
}

...但是,总是希望未初始化的值在大多数情况下不存在时会被赋予默认值。 (该函数非常大,因为它也适用于对象和数组)

答案 1 :(得分:0)

您可以将json_decode与包含返回的JSON的变量一起使用,然后使用array_key_exists检查对象是否包含错误键。

array_key_exists("error", $jsonArray)

似乎与How to check if an array element exists?类似的问题。

答案 2 :(得分:0)

从技术上讲,您可以将对象强制转换为数组并使用array_key_exists()。这不是最优雅的解决方案,但它会起作用。

$json = '[{"Error":"1050"}]';

$j = json_decode($json);


if (array_key_exists(0, $j)) {

    if (array_key_exists('Error', (array)$j[0])) {
        // It exists
    }
}

答案 3 :(得分:-1)

$someobject = json_decode($yourjsongoeshere);

if(isset($someobject["Error"])){
    echo ($someobject["Error"]);
}