Как бы мне пройти через это? - PullRequest
2 голосов
/ 04 ноября 2011

У меня большой массив.

В этом массиве у меня есть (среди многих других) список продуктов:

$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) кажется мне глупым или нет ничего плохого в этом подходе.

А может, есть другой подход?

Ответы [ 3 ]

4 голосов
/ 04 ноября 2011

Ваш метод работает, если числовые части гарантированно последовательны. Если есть пробелы, он пропустит все, что будет после первого пробела.

Вы можете использовать что-то вроде:

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

, который вернет все ключи name из вашего массива. Вы извлекаете часть цифры из имени ключа, а затем можете использовать ее для ссылки на раздел «desc».

foreach($names as $name_field) {
   $id = substr($names, 12);
   $name_val = $data["product_name_{$id}"];
   $desc_val = $data["product_desc_{$id}"];
}
1 голос
/ 04 ноября 2011

Я думаю, что вы близко. Просто поместите тест в состояние 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, но ведет себя немного иначе, поэтому может работать, а может и не работать:

Что быстрее и лучше определить, существует ли в PHP ключ массива?

Разница между isset и array_key_exists

1 голос
/ 04 ноября 2011

Как насчет этого

$i = 0;
while(array_key_exists('product_name_'.$i, $data)) {
    // loop body
    $i++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...