在 while 循环中分配数组会导致无限循环


Assigning an array inside a while loop causes infinite loop

$pie = array('Apple' => 1, 'Cherry' => 3, 'Pumpkin' => 6);
reset($pie);
while (list($k, $v) = each($pie)) {
    echo "$k => $v'n";
    $desserts[]=$pie;
}

如果注释掉$desserts[]=$pie行,则此代码块将按预期执行。

为什么当它没有注释时会进入无限循环?

我不明白为什么会这样。 这是不该做什么的完美例子,但我不明白为什么一遍又一遍地打印完整的数组。 我以为只有第一片会重复。

在手册中,它警告你不要做你正在做的事情。

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

请参阅each()文档。

如果您只想制作许多副本,则可以使用 array_fill 获得相同的结果$pie .

 $desserts = array_fill(0,count($pie),$pie);

您可以通过使用 foreach 循环而不是 while 循环来避免此循环:

$pie = array('Apple' => 1, 'Cherry' => 3, 'Pumpkin' => 6);
foreach($pie as $k => $v){
    echo "$k => $v'n";
    $desserts[]=$pie;
}
$pie = array('Apple' => 1, 'Cherry' => 3, 'Pumpkin' => 6);
reset($pie);
while (list($k, $v) = each($pie)) {
    echo "$k => $v'n";
    $desserts[]=$pie;
}

没有那么多意义。您基本上是在复制$pie中每个条目的$pie数组。

使用 foreach 会更安全。下面的样本是否会更贴近预期的结果?

$pie = array('Apple' => 1, 'Cherry' => 3, 'Pumpkin' => 6);
$desserts = array();
foreach($pie as $fruit => $count){
    $dessert = array(
        'fruit' => $fruit,
        'count' => $count
    );
    $desserts[] = $dessert;
}