php访问object元素,关于object:获取PHP stdObject中的第一个元素

我有一个看起来像这样的对象(存储为$ 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呢? 可能吗?

谢谢!

可以使用。来访问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()很好,因为你不需要知道密钥,只需要知道位置(第一个或最后一个)。

他们应该像first()或类似的东西一样命名reset()以使其更有意义。这个答案是正确的。正确的答案不起作用。

转到最佳实践和OOPS,这个答案必须标记为已更正,尽管我的答案提供的解决方案不是最好的方法。

更新2019年

Moving on to the best practices of OOPS, @MrTrick's answer must be

marked as correct, although my answer provides a hacked solution its not

the best method.

简单地使用{}迭代它

例:

$videos{0}->id

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

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

$videos{0}['id']

不确定此{}运算符是否明确存在文档。但凭借经验,我知道这是可能的。您会更有兴趣知道{}运算符也可用于迭代字符串,例如:$ str ="cool";如果你回显$ str {0}它将输出第一个字母"C"而echo $ str {1}将输出"o"等等。试一试..

使用PHP 5.6,这是不可能的。您收到以下消息:无法使用stdClass类型的对象作为数组

@Dereckson {}与PHP 5.6完美搭配,通过删除 - >和使用['objectName']在语法上稍有改动。最终代码为$videos{0}['id']。 Php 5.4+更多地强调对象 - >可能不起作用,因为{0}已经引用了对象。

对于之前评论中缺乏准确性,我感到很遗憾。在PHP 5.6.2下的对象上使用{0}时,抛出致命错误,而不是 - > id。

@Dereckson可能你会收到类似Trying to get the property of a non object的错误,因为{0}仍然会对对象上的节点进行裁判。虽然标识符 - > elementName或['elementName']是必须的。

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

@Dereckson有趣的是,你可能应该在这里发布关于堆栈溢出的代码,我们可以看看它,也许我们有一个解决方案。

我谈到了OP代码。解决方案是在此页面上使用所有其他答案,这些都可以。

@Dereckson知道代码无效的原因有助于我们解决问题并提供更好的答案。我想你明白我的观点,欢迎你使用任何有效的答案。

它已经回答了另一个问题,它不适用于最近的PHP版本。而不是"在stdObject中",您考虑"在任何对象[继承基础对象类]"中。然而,stdObject在PHP中不是这样的对象,因为它不从基础对象类继承。

@Dereckson我很困惑,想知道你如何直接使用该类而不继承0r创建一个对象?它值得在这里给你一个新问题的代码

@Dereckson在另一个说明中,这在使用PHP 5.6测试的最新版本上运行良好并且效果很好。

你能分享一下该技术有效的代码片段吗?

@sure我当然可以,请发布你的stdObject代码,我们可以从那里拿走它。

我在PHP 5.6.7中访问子对象的方法是$videos->{0}或$videos->{0}->id。我在这里看不到这个。

只是要注意,当对象定义了/ string键时,这不起作用。

@MKNWebSolutions甚至一个定义的sting或Key都有一个内部数字键因此可以工作..或者你能为我们提供一个例子吗?

@ClainDsilva stdObject as $ x = {"xyz":123},使用$ x - > {0}不会返回第一个元素。

@MKNWebSolutions你在谈论stdClass,这不是我们讨论基础类的讨论点,PHP在标准类和基类中有很多不同。你应该阅读这个以获得更多见解stackoverflow.com/questions/931407/什么 - 是 - stdClass的功能于PHP

@Clain Dsilva:你错了。你不能迭代字母而是字节。这完全不同。

@JohnSmith证明我错了或亲自尝试$str ="Its Possible"; for($i = 0; $i < strlen($str); $i++) { echo $str{$i}."";}

@Clain Dsilva:处理字符串"Grzegrz?ka"

@JohnSmith我看到你对多字节Unicode字符的观点,所以它的字节而不是字符......谢谢你证明我错了.. !! 我今天学了些新东西。

正确:

$videos= (Array)$videos;

$video = $videos[0];

很好的答案,但它并没有真正帮助我浏览一个对象,它只是将它转换为一个数组,然后将其导航为一个数组。

更容易:

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

如果您不知道节点名称,这很好。

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

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

我正在使用PHP 5.4.3。

就我而言,$videos{0}->id和$videos{0}['id']都不起作用并显示错误:

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

您可以在对象上循环并在第一个循环中中断...

就像是

foreach($obj as $prop) {

$first_prop = $prop;

break; // exits the foreach loop

}

与其他解决方案不同,此解决方案也适用于HHVM

使用Php交互式shell,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正在使用对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值