Php Can';t通过索引访问数组,但可以使用foreach进行迭代

Php Can';t通过索引访问数组,但可以使用foreach进行迭代,php,Php,为什么我不能通过索引$obj->property[0]访问数组,但可以遍历数组(每个数组只有一个值),然后获取值 foreach($obj->property as $inner_obj) { foreach($inner_obj->property as $inner_inner_obj) echo $inner_inner_obj->property; } $obj不是其stdClass对象的数组 因为$obj->property[0]将显示未定义的偏移量:0 尝试这

为什么我不能通过索引
$obj->property[0]
访问数组,但可以遍历数组(每个数组只有一个值),然后获取值

foreach($obj->property as $inner_obj) { foreach($inner_obj->property as $inner_inner_obj) echo $inner_inner_obj->property; }
$obj
不是其
stdClass对象的数组

因为
$obj->property[0]
将显示
未定义的偏移量:0

尝试这样使用它来获取
属性的第一个值

$obj->property->property;

因为在foreach中循环数组的属性。使用[0]可以显式地尝试将其作为数组访问。你可以让你的对象扩展ArrayObject,让php以数组的形式访问你的对象,我想这就是你想要的

能够将对象用作数组的接口:


可以扩展的对象本身:


在我看来,在没有数组接口的对象上循环从来都不是一个好主意,因为这意味着您正在使用公共变量。我的建议是,除非另有可能(SOAP?),否则应始终将它们设置为受保护的或私有的。您可以通过getter和setter访问它们。

如果您通过
实现类
可计数,迭代器
可以创建一个对象,该对象与
foreach
一起工作,但它不是数组

属性
可以是一个数组,而不具有key
0
。 数组中的键可能不是数字。因此,您的数组可能是关联数组,而不是常规数组。 如果需要数字索引,请尝试以下操作:

  $numArray = array_values($obj->property);
  var_dump($numArray);
如果要访问数组的第一个值,请使用:

  $first = reset($obj->property);

如果你的变量是一个
数组

你能在你的问题中添加:
var\u dump($obj->property)
?print\r($obj->property)也许不是数组,数组对我来说是对象,不是数组?我想这是一个对象实现,但你可以通过对象属性进行迭代。检查此链接;所以,没有其他方法(当然除了foreach)来访问我需要的值?顺便说一句,我使用的是Yii框架。CModel类还实现了IteratorAggregate、ArrayAccess
  $first = reset($obj->property);