我将如何循环?

时间:2011-11-04 17:21:42

标签: php loops

我有一个大阵列。

在这个数组中,我(以及许多其他东西)有一个产品列表:

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

此阵列由第三方提供(因此我无法控制此情况)。

目前还不知道阵列中会有多少产品。

通过所有产品循环的干净方法是什么?

我不想使用foreach循环,因为它也会遍历(大)数组中的所有其他项。

我无法使用for循环,因为我不知道(但)数组包含多少产品。

我可以做一个循环:

$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)看起来很愚蠢,或者这种做法没有错。

或许还有另一种方法?

3 个答案:

答案 0 :(得分:4)

只要数字部分保证是连续的,您的方法就可以正常工作。如果存在差距,它将会错过第一个差距之后的任何内容。

您可以使用以下内容:

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

将返回数组中的所有“名称”键。您可以从键名中提取数字部分,然后也可以使用它来引用“desc”部分。

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

答案 1 :(得分:1)

这个怎么样

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

答案 2 :(得分: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