2011-11-04 50 views
2

我有一個大陣列。我將如何循環瀏覽?

在這陣我有(其中包括許多其他的東西)的產品列表:

$data['product_name_0'] = ''; 
$data['product_desc_0'] = ''; 
$data['product_name_1'] = ''; 
$data['product_desc_1'] = ''; 

該陣列由第三方提供的(所以我必須在這個無法控制)。

目前還不知道陣列中有多少產品。

什麼是乾淨的方式來循環所有的產品?

我不想使用foreach循環,因爲它也會遍歷(大)數組中的所有其他項目。

我不能使用for循環,因爲我還不知道數組包含多少產品。

我可以做一個while循環:

$i = 0; 
while(true) { // doing this feels wrong, although it WILL end at some time (if there are no other products) 
    if (!array_key_exists('product_name_'.$i, $data)) { 
     break; 
    } 

    // do stuff with the current product 

    $i++; 
} 

有沒有這樣做上面的更清潔的方式?

while(true)看起來對我來說很愚蠢,或者這種方法沒有錯。

或者還有另一種方法?

回答

4

只要數字部分保證連續,您的方法就可以工作。如果有差距,它會錯過第一次差距之後發生的任何事情。

您可以使用類似:

$names = preg_grep('/^product_name_\d+$/', array_keys($data)); 

which'll返回所有「名稱」鍵從你的陣列。您可以從鍵名中提取數字部分,然後可以使用它來引用'desc'部分。

foreach($names as $name_field) { 
    $id = substr($names, 12); 
    $name_val = $data["product_name_{$id}"]; 
    $desc_val = $data["product_desc_{$id}"]; 
} 
+0

現在很時髦! +1 – PeeHaa

+0

這個解決方案是最乾淨的imo,不知道爲什麼當foreach做這個工作時會選擇一個while循環控制。 –

+1

不錯。我喜歡這個。雖然問題。速度方面,'preg_grep'如何執行?它基本上循環遍歷整個集合來運行正則表達式,然後再次循環匹配?不過,如果你不能保證連續的項目,這是一個勝利者。 –

1

這個怎麼樣

$i = 0; 
while(array_key_exists('product_name_'.$i, $data)) { 
    // loop body 
    $i++; 
} 
+0

啊該死的。完全忽略它。當然! :) tnx – PeeHaa

1

我覺得你很接近。只要把測試放在while條件下。

$i = 0; 
while(array_key_exists('product_name_'.$i, $data)) { 
    // do stuff with the current product 

    $i++; 
} 

你也可以考慮:

$i = 0; 
while(isset($data['product_name_'.$i])) { 
    // do stuff with the current product 

    $i++; 
} 

isset略快array_key_exists但行爲有所不同,因此可能會或可能不會爲你工作:

What's quicker and better to determine if an array key exists in PHP?

Difference between isset and array_key_exists

+1

'isset()'的行爲與'array_key_exists()'不同的事實是我沒有使用它的reaseon :)謝謝 – PeeHaa