这种行为是语言的特征吗?
PHP 数组中“指针”的含义与“指针”的一般含义(在 C/C++ 或其他允许程序员直接访问内存的语言中)不同。
PHP 中没有指针。这array http://php.net/manual/en/language.types.array.php数据类型在其包含的值列表内部保留一个游标。称为数组的内部指针,由函数修改reset() http://php.net/manual/en/function.reset.php, next() http://php.net/manual/en/function.next.php, prev() http://php.net/manual/en/function.prev.php, end() http://php.net/manual/en/function.end.php, each() http://php.net/manual/en/function.each.php也许还有其他人。它可用于迭代数组,如下所示:
$array = array(1, 2, 3);
while (list($key, $val) = each($array)) {
echo($key.' => '.$val."\n");
}
没有可靠的方法来使用迭代数组next() http://php.net/manual/en/function.next.php or prev() http://php.net/manual/en/function.prev.php因为他们回来了FALSE
当没有更多的元素可以迭代但它们也返回时FALSE
当值FALSE
作为元素存储在数组中。
如果您只需要分析数组开头(或结尾)的几个项目,它们可能会很有用。 F.e.假设我们有一个函数返回的整数数组,我们需要获取第一个不为零的值。
但是这个目标可以通过使用更容易地实现foreach()
:
$array = array(0, 0, 0, 2, 0, 1, 0, 3);
foreach ($array as $val) {
if ($val != 0) {
break;
}
}
echo($val); // prints "2"
or array_shift()
:
$array = array(0, 0, 0, 2, 0, 1, 0, 3);
do {
$val = array_shift($array);
if ($val != 0) {
break;
}
} while(count($array));
echo($val); // prints "2"
结果是预期的:指针已重置。我的问题是指针是否仅在数组结束后重置?
的文档foreach() http://php.net/manual/en/control-structures.foreach.php是错的。也许它在 PHP 3 和 PHP 4 上是正确的,但我认为自从引入迭代器 http://php.net/manual/en/class.iterator.php在 PHP 5 中的行为foreach() http://php.net/manual/en/control-structures.foreach.php改变(变得更好)。
It says:
当 foreach 第一次开始执行时,内部数组指针会自动重置为数组的第一个元素。这意味着您不需要在 foreach 循环之前调用 reset()。
由于 foreach 依赖于内部数组指针,因此在循环内更改它可能会导致意外的行为。
一个简单的测试与这个说法相矛盾:
$array = array(1, 3, 5, 7, 9);
foreach ($array as $val1) {
foreach ($array as $val2) {
echo('$val1='.$val1.'; $val2='.$val2.'; ');
}
echo("\n");
}
它工作没有问题。它不应该工作,如果foreach()
正在使用内部数组指针。它可能会创建指针的副本。
您也可以尝试使用current()
, next()
, prev()
or reset()
在 - 的里面foreach()
你会得到令人惊讶的、有时甚至不一致的结果。
你最好用foreach()
迭代数组并且不以任何方式依赖内部指针。
功能reset()
and end()
然而,当您需要获取数组的第一个和最后一个元素而不用担心键时,它们非常方便。