2011-11-04 63 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