Замена Do … While Loops

У меня есть следующий код, взятый из руководства PHP по записям curl_multi_ *:

$active = null; do { $process = curl_multi_exec($curl, $active); } while ($process === CURLM_CALL_MULTI_PERFORM); while (($active >= 1) && ($process === CURLM_OK)) { if (curl_multi_select($curl, 3) != -1) { do { $process = curl_multi_exec($curl, $active); } while ($process === CURLM_CALL_MULTI_PERFORM); } } 

Теперь дело в том, что мне действительно не нравится писать … в то время как циклы, и мне было интересно, что будет лучшим и более коротким способом добиться того же, но без использования таких петель.

До сих пор я придумал немного более длинную версию, но я не уверен, что она делает то же самое или если она работает так же, как и исходная:

 while (true) { $active = 1; $process = curl_multi_exec($curl, $active); if ($process === CURLM_OK) { while (($active >= 1) && (curl_multi_select($curl, 3) != -1)) { $process = CURLM_CALL_MULTI_PERFORM; while ($process === CURLM_CALL_MULTI_PERFORM) { $process = curl_multi_exec($curl, $active); } } break; } else if ($process === CURLM_CALL_MULTI_PERFORM) { continue; } break; } 

Заранее спасибо.

Do..While петли близки к Do..While While , за исключением того, что они обеспечивают код внутри цикла Do..While выполняется хотя бы один раз. Таким образом, простой способ конвертировать Do..While циклы – это вытащить код из Do..While чтобы он Do..While один раз и преобразовывался в While .

 do { action(); } while(...) 

эквивалентно:

 action(); while(...) { action(); } 

Поэтому для вашего кода это изменение будет выглядеть так:

 $active = null; $process = curl_multi_exec($curl, $active); while ($process === CURLM_CALL_MULTI_PERFORM) { $process = curl_multi_exec($curl, $active); } while (($active >= 1) && ($process === CURLM_OK)) { if (curl_multi_select($curl, 3) != -1) { $process = curl_multi_exec($curl, $active); while ($process === CURLM_CALL_MULTI_PERFORM) { $process = curl_multi_exec($curl, $active); }; } } 

С учетом сказанного, нет ничего плохого в Do..While циклы, и вы должны использовать их, если вам нужно.

Я не вижу проблемы с do while while. Они должны использоваться, когда код внутри циклов содержит что-то, что должно выполняться как минимум 1 раз и более раз, если условие выполнено.

ИМО, я думаю, что ваш первый набор кода более ясен.

Будет ли это делать?

 $active = null; $process = curl_multi_exec($curl, $active); while ($process === CURLM_CALL_MULTI_PERFORM) { $process = curl_multi_exec($curl, $active); }; $process = curl_multi_exec($curl, $active); while (($active >= 1) && ($process === CURLM_OK)) { if (curl_multi_select($curl, 3) != -1) { while ($process === CURLM_CALL_MULTI_PERFORM) { $process = curl_multi_exec($curl, $active); } } }