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

时间:2013-04-08 11:44:50

标签: php

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

foreach($obj->property as $inner_obj)
{
    foreach($inner_obj->property as $inner_inner_obj)
        echo $inner_inner_obj->property;
}

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

编辑:var_dump的输出

array(1) {
 [0]=> object(FooClass)#141 {
   // yadda yadda
  }
}

4 个答案:

答案 0 :(得分:0)

$obj不是其stdClass Object

数组

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

尝试使用它来获取property的第一个值

$obj->property->property;

答案 1 :(得分:0)

因为你在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

Imo,在没有数组接口的情况下循环一个对象永远不是一个好主意,因为这意味着你正在使用公共变量。我的建议是总是让它们受到保护或私有,除非另有说明(SOAP?)。您可以通过getter和setter访问它们。

答案 2 :(得分:0)

如果您按implements Countable, Iterator进行课程,则可以创建一个与foreach配合使用的对象,但它不是数组

答案 3 :(得分:0)

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

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

如果要访问数组的第一个值,请使用:

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

如果您的变量是array,则无效。