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

时间:2013-11-22 15:45:48

标签: php arrays while-loop 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行,则此代码块将按预期执行。

为什么当它被取消注释时会进入无限循环?

我不明白为什么会这样。这是不做的完美示例,但我不明白为什么要反复打印完整的数组。我以为只会重复第一片。

3 个答案:

答案 0 :(得分:6)

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

  

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

See documenation for each()

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

$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;
}