2013-11-22 96 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; 
}