METANIT.COM

Php while внутри while

Для совершения повторяемых действий в PHP, как и в других языках программирования, используются циклы. В PHP имеются следующие виды циклов:

Цикл for

Цикл for имеет следующее формальное определение:

for ([инициализация счетчика]; [условие]; [изменение счетчика]) < // действия >

Рассмотрим стандартный цикл for:

Первая часть объявления цикла — $i = 1 — создает и инициализирует счетчик — переменную $i. И перед выполнением цикла его значение будет равно 1. По сути это то же самое, что и объявление переменной.

Третья часть — $i++ — изменение счетчика на единицу. Опять же нам необязательно увеличивать на единицу. Можно уменьшать: $i—. Или, например, увеличить не на 1, на 3: $i +=3 .

В итоге блок цикла сработает 9 раз, пока значение $i не станет равным 10. И каждый раз это значение будет увеличиваться на 1. Каждое отдельное повторение цикла называется итерацией. Таким образом, в данном случае произойдет 9 итераций.

В итоге браузер отобразит нам следующий результат:

Квадрат числа 1 равен 1 Квадрат числа 2 равен 4 Квадрат числа 3 равен 9 Квадрат числа 4 равен 16 Квадрат числа 5 равен 25 Квадрат числа 6 равен 36 Квадрат числа 7 равен 49 Квадрат числа 8 равен 64 Квадрат числа 9 равен 81

Объявление цикла for может опускать отдельный части. Например, опустить определение счетчика (он может быть определен вне цикла):

Можно опустить изменение значения счетчика и изменять его внутри цикла:

В данном случае в цикле на каждой итерации переменная $i увеличивает значение на 2. Соответственно мы получим следующий результат:

Также можно в объявлении цикла определять и использовать сразу несколько переменных:

В данном случае в объявлении цикла определяются две переменных: $i и $j. При каждой итерации переменная $i увеличивается на 1, а $j — на 2. При этом цикл продолжается, пока сумма двух переменных не достигнет 10:

Также можно применять альтернативный синтаксис, при котором вместо открывающей фигурной скобки ставится двоеточие, а вместо закрывающей фигурной скобки — ключевое слово endfor :

Цикл while

Цикл while проверяет истинность некоторого условия, и если условие истинно, то выполняются блок выражений цикла:

Если в блоке while всего одна инструкция, то фигурные скобки блока можно опустить:

Также можно применять альтернативный синтаксис, при котором вместо открывающей фигурной скобки ставится двоеточие, а вместо закрывающей фигурной скобки — ключевое слово endwhile :

$counter = 1; while($counter<10): echo $counter * $counter . "
"; $counter++; endwhile;

Цикл do..while

Цикл do..while похож на цикл while , только теперь выполняется блок цикла, и только потом выполняется проверка условия. То есть даже если условие ложно, то блок цикла выполнится как минимум один раз:

Читайте также:  Redux devtools extension typescript

Операторы continue и break

Иногда возникает ситуация, когда требуется выйти из цикла, не дожидаясь его завершения. В этом случае мы можем воспользоваться оператором break :

80) < break; >echo "Квадрат числа $i равен $result 
"; > ?>

И если вдруг результат операции окажется больше 80, то происходит выход из цикла.

Для управления циклами также применяется оператор continue . Он осуществляет переход к следующей итерации цикла:

 echo "Квадрат числа $i равен " . $i * $i . "
"; > ?>

При выполнении программы, когда значение $i станет равным 5, произойдет переход к следующей итерации, а все остальные выражения, которые следуют после оператора continue выполняться не будут.

Вложенные циклы

Циклы могут располагаться внутри циклов. Например, используем вложенный цикл, чтобы вывести таблицу умножения:

      "; for ($j = 1; $j < 10; $j++) < echo ""; > echo ""; > ?>
" . $i * $j . "

После 9 итераций, когда переменная $j достигнет 10, вложенный цикл завершается, и внешний цикл выводит закрывающий тег строки:

И запускается новая итерация внешнего цикла.

В итоге скрипт сформирует таблицу умножения:

Источник

Как правильно написать цикл while внутри while в PHP?

Всем здравствуйте, как будет правильно: Например вывод статей через while из база данных, в котором изображения внутри статьи тоже через while из базы данных?
Проблема в том, что выводит только одну статью, с одной изображением
структура БД:
db_news (id, news. )
db_news_img (id, news_id, link_img)
Сам код:

$db->Query("SELECT * FROM db_news WHERE cat_id = '$catid' ORDER BY id DESC");// if($db->NumRows() > 0)< while($news = $db->FetchArray())< $textfull = $news["news"];
$db->Query("SELECT * FROM db_news_img WHERE news_id = '$news[id]' ORDER BY id DESC");// if($db->NumRows() > 0)< while($img = $db->FetchArray())
" role="button" data-slide="prev"> Previous  " role="button" data-slide="next"> Next  
" aria-labelledby="heading" data-parent="#accordionNews">

Средний 3 комментария

Пробовал так: первый цикл через while, вторую через foreach. Проблема та же, выводит только одну. Вреда цикл обрывается, при повторном запросе в БД. Не могу решить эту проблему

$news = $db->FetchArray(); foreach ($news as $new)

Всё потому, что вы используете одно и то же подключение к базе данных. Получается так:
1. Запрашиваются записи из db_news, база принимает этот запрос как текущий.
2. Читается первая запись текущего запроса, т.е. из db_news.
3. Через это же подключение запрашиваются записи из db_news_img. База запоминает новый запрос как текущий, готова передавать записи из db_news_img.
4. Читается первая запись текущего запроса, т.е. из db_news_img.
5. Возврат к началу цикла, хочется прочитать из db_news. Но этот запрос уже не является текущим, он "потерян", поэтому из него невозможно получить данные.
6. Данных нет - значит конец цикла.

Вам нужно запоминать и использовать указатель запроса, скорее всего так:

$db_res1 = $db->Query("SELECT * FROM db_news WHERE cat_id = '$catid' ORDER BY id DESC");// if($db_res1->NumRows() > 0)< while($news = $db_res1->FetchArray())< $textfull = $news["news"]; $db_res2 = $db->Query("SELECT * FROM db_news_img WHERE news_id = '$news[id]' ORDER BY id DESC");// if($db_res2->NumRows() > 0)< while($img = $db_res2->FetchArray())

daemonhk

Получать данные заранее(. ), а не в цикле и не посреди вывода страницы.

1. Использовать LEFT/INNER JOIN
или
2. Перебрать массив с картинками так, чтобы ключом был id новости, тогда можно проверять наличие картинки для новости - if(isset($news_img[$news["id"]])) и потребуется всего один цикл

daemonhk

//$news - получили заранее //$news_img - получили заранее //заполняем массив с картинками $images = []; foreach($news_img as $img) < $images[$img['news_id']] = $img; unset($img); >//проверяем наличие новости в картинках (что бы это ни значило. ) foreach($news as $item) < if(!empty($images[$item['id']]))< //выводим картинку новости >unset($item); >

Источник

Несколько циклов while внутри цикла while?

Всего новичок пытается учиться … спасибо за всю помощь до сих пор!

UPDATE – обновленный код ниже – Спасибо Фил

Теперь я пытаюсь получить соответствующую информацию о horses с настольных horses которыми я могу присоединиться к race_form с полем horse_name. Затем я хочу отобразить информацию для каждой лошади в гонке ниже ($ racecard). Это делает это немного яснее?

Я думал, что могу просто сделать еще один запрос, а затем цикл while с mysql_fetch_array под тем, который у меня уже есть, и который отобразит его, а затем переместится на следующую гонку, но это, по-видимому, не работает …?!

Мне интересно, можете ли вы запустить 2 в цикле после друг друга внутри цикла? Я работаю на коньках с конным спортом – я могу отображать каждый список расы, но под ним я хочу отображать отдельные детали лошади на каждой лошади в гонке. В любом случае, если вы посмотрите на эту страницу, вы увидите, что я пытаюсь сделать:

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

Я надеюсь, что это достаточно ясно … мой фрагмент кода ниже – пожалуйста, дайте мне знать, если я пропустил что-то важное:

echo ""; $racedetails = mysql_query("SELECT * FROM race_info WHERE meetingID = ('" . $safemeetingID . "')"); while($row = mysql_fetch_array($racedetails)) < echo ""; $racecard = mysql_query("SELECT * FROM race_form INNER JOIN race_info ON race_form.raceID = race_info.raceID WHERE race_form.raceID = ('" . $row['raceID'] . "')"); while($row = mysql_fetch_array($racecard)) < echo ""; > echo "
Race " . $row['race_number'] . " at " . $row['start_time'] . " " . $row['class'] . " over " . $row['distance'] . "m
" . $row['number'] . "" . $row['past10'] . "" . $row['horse_name'] . "

"; echo "
I wish I could put in some horse form here.
"; echo ""; > echo "
";

Solutions Collecting From Web of "Несколько циклов while внутри цикла while?"

Я думаю, вы можете избавиться от одного из своих запросов:

Первый запрос получает количество гонок, выбирая COUNT. Это возвращает одну запись со значением count.

// This returns one record with the count $total_races = "SELECT COUNT(race_number) AS totalraces FROM race_info WHERE meetingID = ('".$safemeetingID."') "; 

Затем вы перебираете те же записи, что и строки, возвращаемые для деталей гонки, такие же, как и счет.

// This looks to return the record(s) with the race details $race_details = "SELECT * FROM race_info WHERE meetingID = ('" . $safemeetingID . "')"; 

Я думаю, вы можете просто использовать это, чтобы получить желаемые результаты: (Я соглашаюсь переименовать переменную $ row в какой-то описательный для каждого цикла while)

$racedetails = mysql_query("SELECT * FROM race_info WHERE meetingID = ('" . $safemeetingID . "')"); while($details_row = mysql_fetch_array($racedetails)) < echo "Race " . $details_row['race_number'] . " at " . $details_row['start_time'] . " " . $details_row['class'] . " over " . $details_row['distance'] . "m"; $racecard = mysql_query("SELECT * FROM race_form INNER JOIN race_info ON race_form.raceID = race_info.raceID WHERE race_form.raceID = ('" . $details_row['raceID'] . "')"); while($rc_row = mysql_fetch_array($racecard)) < echo "" . $rc_row['number'] . "" . $rc_row['past10'] . "" . $rc_row['horse_name'] . ""; > echo "
"; echo "Testing
Testing
I wish I could put in some horse form here.
"; echo ""; >
"SELECT * FROM horses AS h, INNER JOIN race_info AS ri ON race_form.raceID = race_info.raceID WHERE horse_name IN ( SELECT horse_name FROM race_form AS srf WHERE h.horse_name = srf.horse_name ) AND race_form.raceID = ('" . $details_row['raceID'] . "')" 

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

Или вы можете сделать еще один запрос в цикле для имен лошадей

$racedetails = mysql_query("SELECT * FROM race_info WHERE meetingID = ('" . $safemeetingID . "')"); while($details_row = mysql_fetch_array($racedetails)) < echo "
"; $racecard = mysql_query("SELECT * FROM race_form INNER JOIN race_info ON race_form.raceID = race_info.raceID WHERE race_form.raceID = ('" . $details_row['raceID'] . "')"); while($rc_row = mysql_fetch_array($racecard)) < echo ""; $horses = mysql_query("SELECT * FROM horses WHERE horse_name = ('" . $rc_row['horse_name'] . "')"); while($horse_row = mysql_fetch_array($horses)) < // echo horse details here >> echo "
Race " . $details_row['race_number'] . " at " . $details_row['start_time'] . " " . $details_row['class'] . " over " . $details_row['distance'] . "m
" . $rc_row['number'] . "" . $rc_row['past10'] . "" . $rc_row['horse_name'] . "

"; echo "Testing
Testing
I wish I could put in some horse form here.
"; echo ""; >

Вероятно, вам нужно будет изменить имена некоторых переменных $row , они могут мешать друг другу.

while($row_races = mysql_fetch_array($totalraces)) < while($row_details = mysql_fetch_array($racedetails))< while($row_card = mysql_fetch_array($racecard))

Теория я мог бы и на практике вы можете, но через некоторое while в for некоторого while кажется немного выше …

Я уверен, что мы можем помочь вам сделать его более эффективным, если вы объясните, что именно вы пытаетесь сделать.

  • Вызов chroot в PHP
  • обнаружение бесконечной рекурсии массива в PHP?
  • Сжатие текста перед его сохранением в базе данных
  • Запуск MySQL * .sql файлов в PHP
  • Неожиданный T_PAAMAYIM_NEKUDOTAYIM в PHP 5.2.x
  • На стороне сервера, получите прогресс при отправке файла
  • Параметр fgetcsv / fputcsv $ escape полностью нарушен
  • Каков параметр пароля для openssl_encrypt?
  • Многомерный массив Php из результата mysql
  • Как написать модульные тесты для интерактивного консольного приложения
  • Как вычитать с помощью SQL в MYSQL между двумя значениями даты и получить результат в минутах или секунде?
  • Ошибка ввода переменной в качестве моего URL-адреса в PHP fopen ()
  • Как создать пользователя для db в postgresql?
  • Как вставить PHP-код в таблицу в базе данных?
  • Использование pdo в php с хранимой процедурой

Источник

Оцените статью