【问题标题】:Check if property of object inside array exist检查数组内对象的属性是否存在
【发布时间】:2017-07-12 21:56:09
【问题描述】:

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

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

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

JSON

[{"Error":"1050"}]

我的PHP

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

返回:

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

)

【问题讨论】:

  • 到目前为止您尝试过任何代码示例吗?
  • 这是一个 PHP 问题,所以我们假设数据是 JSON,但在 PHP 中访问
  • 我已经测试了很多我删除的东西,我会重新跟踪。 Lee 抱歉,是 json 解码
  • 我不明白发生了什么
  • 嗯,你试过$arr[0]->Error吗?

标签: php


【解决方案1】:

我认为对于您的具体示例,您可以使用 $arr[0]->Error 访问错误,但 json_decode 中的 assoc 选项意味着它取决于您要求 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
}

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

【讨论】:

  • 但是这样,如果 JSON 不返回此错误属性,我会返回注意:未定义属性:stdClass::$Error - 我需要检查它是否存在,但如果我手动将该属性称为错误,如果它不存在,我会返回一个错误。
【解决方案2】:

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

array_key_exists("error", $jsonArray)

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

【讨论】:

  • array_key_exists("错误", $data);这什么都不返回
  • 变量 $data 是指(按照您的示例)数组中的第一个对象(索引 0)吗? $jsonArray[0] 应该返回 stdClass 对象
  • 您需要将对象转换为数组。
【解决方案3】:

从技术上讲,您可以将对象转换为数组并使用 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
    }
}

【讨论】:

    【解决方案4】:
    $someobject = json_decode($yourjsongoeshere);
    
    if(isset($someobject["Error"])){
        echo ($someobject["Error"]);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      相关资源
      最近更新 更多