获取PHP stdObject中的第一个元素


70

我有一个看起来像这样的对象(存储为$ videos)

object(stdClass)#19 (3) {
  [0]=>
  object(stdClass)#20 (22) {
    ["id"]=>
    string(1) "123"

  etc...

我想获取第一个元素的ID,而不必循环访问它。

如果它是一个数组,我会这样做:

$videos[0]['id']

它曾经这样工作:

$videos[0]->id

但是现在我在上面显示的行上收到一个错误“无法将stdClass类型的对象用作数组...”。可能是由于PHP升级。

那么,如何不循环就获得第一个ID?可能吗?

谢谢!

Answers:


70

更新PHP 7.4

自PHP 7.4起不赞成使用花括号访问语法

更新2019

继续使用OOPS的最佳实践,@ MrTrick的答案必须标记为正确,尽管我的答案提供了一个经过破解的解决方案,但这并不是最佳方法。

只需使用{}对其进行迭代

例:

$videos{0}->id

这样,您的对象不会被破坏,并且可以轻松地遍历对象。

对于PHP 5.6及以下版本,请使用此

$videos{0}['id']

4
不太确定此{}运算符的文档是否明确存在。但是根据经验,我知道这是可能的。您可能会更感兴趣地知道{}运算符也可以用于迭代字符串,例如:$ str =“ cool”; 如果你回声$海峡{0}将输出的第一个字母“C”和回声$海峡{1}将输出“O”等等..试用一下..
克兰河Dsilva

4
对于PHP 5.6,这是不可能的。您收到以下消息:不能将stdClass类型的对象用作数组
Dereckson 2014年

1
没有错误,正是Cannot use object of type stdClass as array您尝试将stdClass对象用作数组时的错误。stdClass不继承自基础对象类,因此不提供此功能。
Dereckson

1
只是要注意,当对象定义了/字符串键时,这将不起作用。
MKN Web Solutions'Mar

2
@Clain Dsilva:处理字符串“Grzegrzółka”
John Smith,

78

可以使用 函数访问array()和stdClass对象 。current() key() next() prev() reset() end()

因此,如果您的对象看起来像

object(stdClass)#19 (3) {
  [0]=>
  object(stdClass)#20 (22) {
    ["id"]=>
    string(1) "123"
  etc...

那你就可以做;

$id = reset($obj)->id; //Gets the 'id' attr of the first entry in the object

如果由于某种原因需要钥匙,则可以这样做。

reset($obj); //Ensure that we're at the first element
$key = key($obj);

希望对您有用。:-)即使在超严格模式下,在PHP 5.4上也没有错误


reset()和end()很不错,因为您不需要知道键,只需知道位置(第一个或最后一个)即可。
乔纳森·贝尔

他们应该将reset()命名为first()或类似的名称以使其更有意义。这个答案是正确的。正确答案不起作用。
安德烈斯·拉莫斯

继续进行最佳实践和OOPS,尽管我的答案提供的解决方案并非最佳方法,但必须将其标记为正确。
Clain Dsilva '19

19

容易得多:

$firstProp = current( (Array)$object );

5
如果您不知道节点名称,那就太好了。
布赖恩

16

正确:

$videos= (Array)$videos;
$video = $videos[0];

5
好的答案,但这并不能真正帮助我浏览对象,只是将其转换为数组,然后以数组形式进行导航。
德鲁·贝克

8

$videos->{0}->id 为我工作。

由于$ videos和{0}都是对象,因此我们必须使用访问id $videos->{0}->id。花括号必须在0左右,因为省略花括号会产生语法错误:意外的“ 0”,期望标识符或变量或“ {”或“ $”。

我正在使用PHP 5.4.3

在我的情况下,既没有$videos{0}->id$videos{0}['id']合作,并显示错误:

不能将stdClass类型的对象用作数组。


5

您可以在对象上循环,然后在第一个循环中中断...类似

foreach($obj as $prop) {
   $first_prop = $prop;
   break; // exits the foreach loop
} 

2

使用Php交互式外壳,PHP 7:

➜  ~ php -a
Interactive shell

php > $v = (object) ["toto" => "hello"];
php > var_dump($v);
object(stdClass)#1 (1) {
  ["toto"]=>
  string(5) "hello"
}
php > echo $v{0};
PHP Warning:  Uncaught Error: Cannot use object of type stdClass as array in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1

Warning: Uncaught Error: Cannot use object of type stdClass as array in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1
php > echo $v->{0};
PHP Notice:  Undefined property: stdClass::$0 in php shell code on line 1

Notice: Undefined property: stdClass::$0 in php shell code on line 1
php > echo current($v);
hello

current在处理对象。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.