PHP行为和数组指针

Lui*_*uis 4 php arrays pointers

我正在阅读PHP手册(特别是each()函数)并遇到以下警告:

注意
因为将数组分配给另一个变量会重置原始数组的指针,如果我们将$ fruit分配给循环内的另一个变量,上面的示例会导致无限循环.

一个例子:

<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while (list($key, $val) = each($fruit)) {
    echo "$key => $val\n";
}
?>
Run Code Online (Sandbox Code Playgroud)

好的.这说得通.但我决定做一个简单的测试:

<?php
    $fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

    foreach ($fruit as $key => $name) {
        printf("[%s] => [%s]\n", $key, $name);
    }

    $fruit2 = $fruit;
    echo current($fruit);
?>
Run Code Online (Sandbox Code Playgroud)

结果是预期的:指针已被重置.我的问题是指针是否仅在数组结束后重置?

例如:

<?php
    $fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

    foreach ($fruit as $key => $name) {
        printf("[%s] => [%s]\n", $key, $name);
    }

    reset($fruit);
    next($fruit)."\n";
    $fruit2 = $fruit;
    echo current($fruit);
?>
Run Code Online (Sandbox Code Playgroud)

指针保留在第二个数组元素中('b' => 'banana').这种行为是语言的特征吗?

谢谢你,对不起英语不好意思.

axi*_*iac 5

这种行为是语言的特征吗?

PHP数组中"指针"的含义与"指针"的一般含义不同(在C/C++或其他语言中,程序员可以直接访问内存).

PHP中没有指针.该阵列的数据类型在内部保存它包含的值的列表内的光标.这就是所谓的阵列的内部指针,它是由功能改性reset(),next(),prev(),end(),each()或者其他人.它可以用于迭代数组,如下所示:

$array = array(1, 2, 3);
while (list($key, $val) = each($array)) {
    echo($key.' => '.$val."\n");
}
Run Code Online (Sandbox Code Playgroud)

没有可靠的方法来迭代数组,next()或者prev()因为它们FALSE在没有更多要迭代的元素FALSE时返回,但是当值FALSE作为元素存储在数组中时它们也会返回.

如果您只需要从数组的开头(或结尾)分析几个项目,它们可能很有用.Fe假设我们有一个由函数返回的整数数组,我们需要得到第一个不为零的值.

但是使用以下方法可以更轻松地实现此目标foreach():

$array = array(0, 0, 0, 2, 0, 1, 0, 3);
foreach ($array as $val) {
    if ($val != 0) {
        break;
    }
}
echo($val);           // prints "2"
Run Code Online (Sandbox Code Playgroud)

或者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"
Run Code Online (Sandbox Code Playgroud)

结果是预期的:指针已被重置.我的问题是指针是否仅在数组结束后重置?

文档foreach()是错误的.也许它在PHP 3和PHP 4上是正确的,但我认为自从PHP 5中引入迭代器后,行为发生了foreach()变化(更好).

它说:

当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");
}
Run Code Online (Sandbox Code Playgroud)

它没有问题.如果foreach()使用内部数组指针,它应该不起作用.它可能会创建指针的副本.

您也可以尝试使用current(),next(),prev()reset()在里面foreach(),你会得到令人惊讶,有时不一致的结果.

您最好使用foreach()迭代数组,不要以任何方式依赖内部指针.

功能reset()end(),然而,非常方便,当你需要获得第一和数组的最后一个元素,而不用担心密钥.