我有一个看起来像这样的对象(存储为$ 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正在使用对象。