Инициирование одного и того же цикла с помощью оператора while или foreach - PullRequest
1 голос
/ 15 октября 2010

У меня есть код в php, например:

while($r = mysql_fetch_array($q))
{

// Do some stuff

}

где $ q - запрос, извлекающий набор членов группы. Однако некоторые группы имеют членов, сохраненных в memcached, и это значение memcached сохраняется в массиве как $ mem_entry. Чтобы пройти через это, я обычно делал бы следующее

foreach($mem_entry as $k => $r)
{

// Do some stuff

}

Вот проблема. Я не хочу, чтобы два блока идентичного кода (раздел // do some stuff) были вложены в два разных цикла только потому, что в одном случае я должен использовать mysql для цикла, а другой - memcached. Есть ли какой-нибудь способ переключить запуск с цикла с while или foreach? Другими словами, если $ mem_entry имеет непустое значение, первая строка цикла будет foreach ($ mem_entry as $ k => $ r), или, если она пуста, первая строка цикла будет while ( $ r = mysql_fetch_array ($ q))

1009 ** * Редактировать 1010 ** * 1011

Ну, через несколько секунд после того, как я написал это, я пришел к решению. Думаю, я бы оставил это для всех, кто может столкнуться с этой проблемой. Сначала я устанавливаю значение $ members в значение memcached. Если это пусто, я запускаю запрос mysql и использую цикл while для передачи всех записей в массив с именем $ members. Затем я запускаю цикл, используя foreach ($ members как as $ k => $ r). По сути, я использую цикл foreach каждый раз, но значение $ members устанавливается по-разному в зависимости от того, существует ли значение для него в memcached.

Ответы [ 2 ]

3 голосов
/ 15 октября 2010

Почему бы просто не сделать рефакторинг doSomeStuff () как функции, которая вызывается из каждого цикла.Да, вам нужно посмотреть, не приведет ли это к снижению производительности, но, если это не важно, это простой способ избежать повторения кода.

Если есть способ переключения, как вы предлагаете, я нене знаю об этом.

0 голосов
/ 15 октября 2010

Не идеальное решение, но я дам вам 2 цента. Идеальным было бы вызвать функцию, но если вы не хотите этого делать, вы можете попробовать что-то вроде этого:

if(!isset($mem_entry)){
 $mem_entry = array();
 while($r = mysql_fetch_array($q))
 {

   $mem_entry[] = $r;

 }
}

Идея состоит в том, чтобы просто использовать цикл foreach для выполнения реальной работы. Если в memcache ничего нет, то заполните массив mem_entry материалом из mysql и затем передайте его в цикл foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...