不能通过索引访问数组,但可以使用foreach进行迭代


Can't access array by index, but can iterate with foreach

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

foreach($obj->property as $inner_obj){Foreach ($inner_obj->属性为$inner_inner_obj)echo $ inner_inner_obj ->财产;} 之前

如果我通过索引访问数组,我得到Undefined offset: 0

Edit: Output of var_dump

<>前数组(1){[0]=> object(FooClass)#141 {//等等等等}}

如果你通过implements Countable, Iterator制作类,你可以制作一个与foreach一起工作的对象,但它不是数组

$obj不是其stdClass Object

的数组

因为$obj->property[0]会显示Undefined offset: 0

尝试像这样使用它来获取property

的第一个值
$obj->property->property;

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

提供将对象用作数组的能力的接口:
http://www.php.net/manual/en/class.arrayaccess.php
http://www.php.net/manual/en/class.countable.php
http://www.php.net/manual/en/class.iteratoraggregate.php

可以扩展的对象本身:
http://www.php.net/manual/en/class.arrayobject.php

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

$obj->property可以是一个没有键0的数组。数组中的键可能不是数字。所以你的数组可能是一个关联数组,而不是一个常规数组。如果你想要数字索引,可以这样做:

  $numArray = array_values($obj->property);
  var_dump($numArray);

如果你想访问数组的第一个值,使用:

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

如果你的变量是array