我有一个大阵列。
在这个数组中,我(以及许多其他东西)有一个产品列表:
$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)
看起来很愚蠢,或者这种做法没有错。
或许还有另一种方法?
答案 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?