Php 当项目已创建为关联数组时,如何以数字方式引用数组中的项目

Php 当项目已创建为关联数组时,如何以数字方式引用数组中的项目,php,arrays,Php,Arrays,我使用的是PHP5.3.6 我有下面的代码。除了最后一行尝试根据数组中的位置(而不是关联名称)返回值外,所有操作都正常。有人能解释为什么会发生这种情况,以及我如何构建数组,以便通过关联名称或位置号引用项目吗 谢谢 <?php class myObject { var $Property; function myObject($property) { $this->Property = $property; } } $ListOfObjects['form_a']

我使用的是PHP5.3.6

我有下面的代码。除了最后一行尝试根据数组中的位置(而不是关联名称)返回值外,所有操作都正常。有人能解释为什么会发生这种情况,以及我如何构建数组,以便通过关联名称或位置号引用项目吗

谢谢

<?php
class myObject {
  var $Property;
  function myObject($property) {
    $this->Property = $property;
  }
}
$ListOfObjects['form_a'] = new myObject(1); 
$ListOfObjects['form_b'] = new myObject(2); 
$ListOfObjects['form_c'] = new myObject(3); 
$ListOfObjects['form_d'] = new myObject(4); 

echo "<pre>";
print_r($ListOfObjects);
echo "</pre>";

echo "<hr />";
foreach ($ListOfObjects as $key => $val) {
    echo "<li>" . $ListOfObjects[$key]->Property . "</li>";
}

echo "<hr />";
echo "<li>" . $ListOfObjects['form_a']->Property . "</li>"; // Works ok.

//Edit: ------------------------------------------------------------
//Edit: Everything above is for context only
//Edit: I'm only interested in the line below and why it does not work
//Edit: ------------------------------------------------------------

echo "<li>" . $ListOfObjects[0]->Property . "</li>"; //Does not work.
?>

如果您只需要数组的第一个/最后一个元素,请在不销毁最后一个项目的情况下尝试
结束($array)
并重置($array)
以获取第一个元素

如Flambino所述,如果在数组中循环,请不要使用reset和end,这确实会导致一些意外行为


对于中间的任何内容,您需要使用
array\u slice()

如果您只需要数组的第一个/最后一个元素,请尝试
end($array)
在不销毁最后一个项目的情况下对其执行操作,然后
重置($array)
以获取第一个元素

如Flambino所述,如果在数组中循环,请不要使用reset和end,这确实会导致一些意外行为


对于两者之间的任何内容,您都需要使用
array\u slice()

这不是最好的方法,而是有效且可读的:

$ListOfObjects += array_values($ListOfObjects);

这不是最好的方法,但有效且可读:

$ListOfObjects += array_values($ListOfObjects);

PHP数组不像大多数其他编程语言中的数组,它们更像有序哈希表/有序字典——它们允许通过命名索引进行访问,并在添加新项时保留顺序。如果您想允许使用数字索引访问这样的数组,您必须以这种方式定义它,或者使用其他答案中给出的一种迂回方式

在您的情况下,您可以使用一行代码来允许按索引进行访问:


这将使用相同的数组扩展数组,但使用数字索引。由于对象总是通过引用传递的,因此可以通过编写
$ListOfObjects['form_b']
$ListOfObjects[1]
来访问同一对象。PHP数组与大多数其他编程语言中的数组不同,它们更像是有序哈希表/有序字典——它们允许通过命名索引进行访问,并在添加新项时保留顺序。如果您想允许使用数字索引访问这样的数组,您必须以这种方式定义它,或者使用其他答案中给出的一种迂回方式

在您的情况下,您可以使用一行代码来允许按索引进行访问:


这将使用相同的数组扩展数组,但使用数字索引。由于对象总是通过引用传递的,所以您可以通过编写
$ListOfObjects['form_b']
$ListOfObjects[1]

来访问同一对象。我对这一行(不是循环)感兴趣:
echo“
  • ”$ListOfObjects[0]->属性。“
  • ”//不工作。
    echo“
  • ”。来自索引($ListOfObjects,0)->属性的值。“
  • 我得到以下错误:
    从_index()调用未定义的函数值。
    啊,是的。德拉特。我应该把它连接起来。对不起,我对这行(不是循环)感兴趣:
    echo“
  • ”$ListOfObjects[0]->属性。“
  • ”//不工作。
    echo“
  • ”。来自索引($ListOfObjects,0)->属性的值。“
  • 我得到以下错误:
    从_index()调用未定义的函数值。
    啊,是的。德拉特。我应该把它连接起来。抱歉。不要在使用
    foreach
    -循环的数组上使用
    reset()
    end()
    ,否则会出现奇怪的行为(如果我没有弄错的话),只要不要在使用
    foreach
    循环的数组上使用
    reset()
    end()
    ,否则会出现奇怪的行为(如果我没弄错的话)
    $ListOfObjects += array_values($ListOfObjects);