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

如果$desserts[]=$pie行被注释掉,则此代码块按预期方式执行。在while循环中分配数组会导致无限循环

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

我不明白为什么发生这种情况。这是什么不能做的完美例子,但我不明白为什么整个数组打印一遍又一遍。我认为只是第一片会重复。

回答

6

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

注意:因为分配的阵列到另一个变量重置原始阵列指针,上面的例子中会导致无限循环有我们分配$fruit到环路内的另一个变量。

See documenation for each()

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

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

是的,这是一个不做的例子。我无法得到这种行为。如果指针正在重置,那么为什么输出不会只是“Apple => 1”? – Swoop

+1

@Swoop PHP在修改方法时可以与数组一起使用。当你使用'$ desserts [] = $ pie;'这些值实际上并没有被复制到'$ desserts'中,直到有些东西被改变。所以'重置'可能不会发生,直到PHP看到'$ pie'和'$ desserts'不再是相同的,这可能是'$ pie'到达数组末尾时。 – cgTag

1

您可以通过使用foreach循环,而不是while循环的避免这种循环:

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