不能使用stdClass类型的对象作为数组?

Dai*_*ail 494 php json

我使用了一个奇怪的错误json_decode().它正确解码数据(我看到它使用print_r),但当我尝试访问数组内的信息时,我得到:

Fatal error: Cannot use object of type stdClass as array in
C:\Users\Dail\software\abs.php on line 108
Run Code Online (Sandbox Code Playgroud)

我只是想做:返回的数据$result['context']在哪里$resultjson_decode()

如何读取此数组中的值?

Jon*_*Jon 732

使用第二个参数json_decode使其返回一个数组:

$result = json_decode($data, true);
Run Code Online (Sandbox Code Playgroud)


sve*_*ens 196

该函数json_decode()默认返回一个对象.

您可以像这样访问数据:

var_dump($result->context);
Run Code Online (Sandbox Code Playgroud)

如果你有像这样from-date的标识符(使用上述方法时连字符会导致PHP错误)你必须写:

var_dump($result->{'from-date'});
Run Code Online (Sandbox Code Playgroud)

如果你想要一个数组,你可以这样做:

$result = json_decode($json, true);
Run Code Online (Sandbox Code Playgroud)

或者将对象强制转换为数组:

$result = (array) json_decode($json);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案比第一个(评分最高的)答案更有资格! (3认同)
  • 我试图找到一种方法来引用由knockoutjs设置的php中的_destroy值时花了一段时间才找到这个,所以+1 (2认同)

JiN*_*xus 137

您必须使用它来访问它,->因为它是一个对象.

更改您的代码:

$result['context'];
Run Code Online (Sandbox Code Playgroud)

至:

$result->context;
Run Code Online (Sandbox Code Playgroud)

  • @STWilson 您应该使用双等号 `==`,在您当前的状态下,您使用单个等号 `=` 将 `$var` 值分配给 `$result->context`。并且 `if 语句` 将读取它,就好像它是否为空一样,如果 `$var` 有值,那么这意味着它不为空并且将始终返回 true。 (3认同)

San*_*hal 84

使用true作为第二个参数json_decode.这会将json解码为关联数组而不是stdObject实例:

$my_array = json_decode($my_json, true);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅文档.


Ale*_*nko 81

今天有同样的问题,这样解决了:

如果你打电话,json_decode($somestring)你将得到一个对象,你需要访问$object->key,但如果你打电话,json_decode($somestring, true)你会得到一个字典,并可以访问$array['key']

  • 这为我节省了很多时间!我没有输入真正的参数,并试图将其作为数组访问 (2认同)

Wes*_*orp 59

它不是数组,它是stdClass类型的对象.

您可以像这样访问它:

echo $oResult->context;
Run Code Online (Sandbox Code Playgroud)

更多信息:PHP中的stdClass是什么?


Mil*_*ani 26

正如Php手册所说,

print_r - 打印有关变量的可读信息

当我们使用时json_decode();,我们得到一个stdClass类型的对象作为返回类型.要在其中传递的参数print_r()应该是数组或字符串.因此,我们无法传递内部的对象print_r().我找到了两种方法来解决这个问题.

  1. 将对象转换为数组.
    这可以如下实现.

    $a = (array)$object;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过访问Object的键
    如前所述,当您使用json_decode();function时,它返回一个stdClass的Object.您可以在->Operator 的帮助下访问对象的元素.

    $value = $object->key;
    
    Run Code Online (Sandbox Code Playgroud)

一,如果对象具有嵌套数组,也可以使用多个键来提取子元素.

$value = $object->key1->key2->key3...;
Run Code Online (Sandbox Code Playgroud)

他们也是其他选择print_r(),比如var_dump();var_export();

PS:另外,如果设置了json_decode();to 的第二个参数true,它会自动将对象转换为array();
以下是一些引用: http:
//php.net/manual/en/function.print-r.php
http:// php.net/manual/en/function.var-dump.php
http://php.net/manual/en/function.var-export.php


inf*_*sud 23

要从 json 字符串获取数组作为结果,您应该将第二个参数设置为布尔值 true。

$result = json_decode($json_string, true);
$context = $result['context'];
Run Code Online (Sandbox Code Playgroud)

否则 $result 将是一个 std 对象。但是您可以将值作为对象访问。

  $result = json_decode($json_string);
 $context = $result->context;
Run Code Online (Sandbox Code Playgroud)


Rob*_*lor 14

有时在使用 API 时,您只想将对象保持为对象。要访问具有嵌套对象的对象,您可以执行以下操作:

我们假设当您打印对象时,您可能会看到:

print_r($response);

stdClass object
(
    [status] => success
    [message] => Some message from the data
    [0] => stdClass object
        (
            [first] => Robert
            [last] => Saylor
            [title] => Symfony Developer
        )
    [1] => stdClass object
        (
            [country] => USA
        )
)
Run Code Online (Sandbox Code Playgroud)

要访问对象的第一部分:

print $response->{'status'};
Run Code Online (Sandbox Code Playgroud)

这将输出“成功”

现在让我们来看看其他部分:

$first = $response->{0}->{'first'};
print "First name: {$first}<br>";
Run Code Online (Sandbox Code Playgroud)

预期输出将是带有换行符的“Robert”。

您还可以将对象的一部分重新分配给另一个对象。

$contact = $response->{0};
print "First Name: " . $contact->{'first'} . "<br>";
Run Code Online (Sandbox Code Playgroud)

预期输出将是带有换行符的“Robert”。

访问下一个键“1”的过程是相同的。

print "Country: " . $response->{1}->{'country'} . "<br>";
Run Code Online (Sandbox Code Playgroud)

预期输出将是“美国”

希望这将帮助您理解对象以及为什么我们要将对象保留为对象。您不需要将对象转换为数组来访问其属性。


cod*_*one 13

尝试这样的事情!

而不是获取像这样的上下文:(这适用于获取数组索引)

$result['context']
Run Code Online (Sandbox Code Playgroud)

尝试(这项工作用于获取对象)

$result->context
Run Code Online (Sandbox Code Playgroud)

其他示例是:(如果$result有多个数据值)

Array
(
    [0] => stdClass Object
        (
            [id] => 15
            [name] => 1 Pc Meal
            [context] => 5
            [restaurant_id] => 2
            [items] => 
            [details] => 1 Thigh (or 2 Drums) along with Taters
            [nutrition_fact] => {"":""}
            [servings] => menu
            [availability] => 1
            [has_discount] => {"menu":0}
            [price] => {"menu":"8.03"}
            [discounted_price] => {"menu":""}
            [thumbnail] => YPenWSkFZm2BrJT4637o.jpg
            [slug] => 1-pc-meal
            [created_at] => 1612290600
            [updated_at] => 1612463400
        )

)
Run Code Online (Sandbox Code Playgroud)

然后试试这个:

foreach($result as $results)
{
      $results->context;
}
Run Code Online (Sandbox Code Playgroud)


Arn*_*nab 7

您可以将stdClass对象转换为数组,如:

$array = (array)$stdClass;
Run Code Online (Sandbox Code Playgroud)

stdClsss到数组


小智 7

当您尝试以方式访问它时$result['context'],将其视为一个数组,错误提示您实际上正在处理一个对象,那么您应该以$result->context