Вывод заданного количества столбцов в цикле while

markelovdn

Здравствуйте, подскажите пожалуйста, как вывести три столбца в таблице в цикле while.

PHP:
  1. $query_m =«SELECT date_med_insp FROM `students_medicine` WHERE `ID_students`= ‘».$ID_students.«‘»;
  2. $result_m=mysqli_query($link, $query_m);
  3. echo ‘<table border=1px>’;
  4. echo ‘<th colspan=3>Дата присвоения</th>’;
  5.     echo ‘<tr>’;
  6.     while ($row_m = mysqli_fetch_assoc($result_m)) {
  7.                echo ‘<td>’;
  8.                echo $row_m[‘date_med_insp’];
  9.                echo ‘</td>’;
  10.             }
  11.     echo ‘</tr>’;
  12. echo ‘</table>’;

данный код выводит все что есть массиве в одну строку вот так:

upload_2021-6-5_18-22-42.png

а необходимо что бы с три столбца.

 

mkramer

Ставиить tr-ки по ходу. Элементарный же алгоритм. Считаем, сколько столбцов вывелось, вывелось три — ставим tr-ку

PHP:
  1. echo ‘<table border=1px>’;
  2. echo ‘<tr><th colspan=3>Дата присвоения</th></tr>’;
  3.    $i = 0;
  4.    while ($row_m = mysqli_fetch_assoc($result_m)) {
  5.               if ($i % 3 === 0) {
  6.                     if ($i !== 0) echo «</tr>»;
  7.                     echo «<tr>»;
  8.                }
  9.                echo ‘<td>’;
  10.                echo $row_m[‘date_med_insp’];
  11.                echo ‘</td>’;
  12.                $i++;
  13.            }
  14.    while ($i % 3) {
  15.        echo «<td></td>»;
  16.    }
  17.    echo «</tr>»
  18. echo ‘</table>’;
 

miketomlin

@mkramer, есть же фишка: в заголовке tr не закрывай, а внутри цикла просто по одному условию добавляй </tr><tr> ;)
— Добавлено —
@markelovdn, порядок записей хоть горизонтальный пойдет? Или нужен вертикальный? Если последнее, то нужно общее количество записей делить на три с избытком, или на клиенте что-то мутить.

 

Sail

<tr> не требует закрывающего тега.

 

mkramer

А мне нравится, когда он есть

 

Sail

Браузер в html добавит :)
Зато не обязательно усложнять исходник на PHP, или другом, используемом для построения таблички.

 

markelovdn

Да пока пойдет горизонтальный порядок, но хотелось бы в дальнейшем понять как и вертикально выводить данные, но с предложенным вариантом попробую и так и так.
— Добавлено —
Всем спасибо за ответы!!! Все заработало.

 

miketomlin

Я как раз написал, как можно не усложнять php-код и при этом все же использовать </tr> ;)
— Добавлено —
А вообще фишка универсальная. Можно и на div’ах использовать.

 

mkramer

Ты хоть понял, что там происходит?

 

miketomlin

А зачем? Главное, работает! :)
— Добавлено —
Надеюсь, ТС хоть понял, что th тоже должен быть внутри tr!

Или это тоже не обязательно? :)

 

markelovdn

С предложенным вариантом у меня получается вывод данных, но дальше идет бесконечный цикл вывода td
Вот такой вариант выводит верно:

PHP:
  1. $query_m =«SELECT date_med_insp FROM `students_medicine` WHERE `ID_students`= ‘».$ID_students.«‘»;
  2. $result_m=mysqli_query($link, $query_m);
  3. $numrows = mysqli_num_rows($result_m); // сколько записей в БД
  4.  
  5. $i = 0; // устанавливаем счётчик
  6. echo ‘<table border=1px>’;
  7. echo ‘<th colspan=3>Дата присвоения</th>’;
  8. echo ‘<tr>’;
  9.  
  10.     while ($row_m = mysqli_fetch_assoc($result_m)) {
  11.         $i++;
  12.         if($i%3 == 0){
  13.                 echo ‘<td>’.$row_m[‘date_med_insp’].‘</td><tr>’;
  14.         // условие для вывода первого и второго
  15.         } elseif($i%3 != 0) {
  16.                      echo ‘<td>’.$row_m[‘date_med_insp’].‘</td>’;
  17.         // условие для самой последней записи
  18.         } elseif ($i == $numrows) {
  19.                      echo ‘<td>’.$row[‘date_med_insp’].‘</td></tr>’;
  20.         }
  21.                
  22.     }
  23.     echo ‘</tr>’;
  24. echo ‘</table>’;

Сначала получаем общее количество значений из базы
Затем, когда при делении получается 0 выводим три записи и ставим tr
Потом если счетчик равен количеству записей из базы выводим последнюю запись.
Правильно?

Для меня главное понять как это работает, иначе сюда бы не писал.
А по поводу th внутри tr так получилось, но если я правильно понимаю не должен th быть внутри tr. С версткой приходиться разбираться походу изучения php.

Теперь осталось понять как вывести еще две или одну пустую ячейку когда количество записей из базы не делится на 3 без остатка.
Сейчас получается вот так:

upload_2021-6-7_11-25-27.png

 

artoodetoo

Тебе mkramer показал как, только у него ошибка: в том самом цикле while ($i % 3) для пустых ячеек счётчик $i не увеличивается!
Когда пишешь вслепую, прокручивая программу только в голове, такое случается. А ты старайся понимать, а не копировать.

 

mkramer

И так сложно было понять почему? Мы тут решения на бегу даём, если что, никто не отлаживает.
— Добавлено —

Ну вот для этого и нужен тот цикл, в который я инкремент забыл добавить.

 

miketomlin

@markelovdn, вы сильно исказили то, что вам показали. По условию внутри осн. цикла нужно только «границу» между строками вставлять.

А второй цикл как раз для дополнения последней строки нужен, о чем выше уже написали.
— Добавлено —

PHP:
  1. <table border=1px>
  2.     <tr>
  3.         <th colspan=3>Дата присвоения</th>
  4. <?php for ($i = 0; $row_m = mysqli_fetch_assoc($result_m); $i++): if ($i % 3 == 0): ?>
  5.     </tr>
  6.     <tr>
  7. <?php endif; ?>
  8.         <td><?= $row_m[‘date_med_insp’] ?><td>
  9. <?php endfor; while ($i++ % 3): ?>
  10.         <td></td>
  11. <?php endwhile; ?>
  12.     </tr>
  13. </table>

for можно обратно заменить на while. Просто я показал, как можно инициализировать и инкрементировать счетчик в заголовке цикла. Т.е. длинную строку можно записать так:

PHP:
  1. <?php $i = 0; while ($row_m = mysqli_fetch_assoc($result_m)): if ($i++ % 3 == 0): ?>
 

markelovdn

Многое понял, спасибо за наставления. Все работает, осталось доделать что бы выводилось 5 строк в 3 столбца, даже если из базы выводится 1 значение, остальные будут пустыми, но это уже точно сам доделаю. Это последняя таблица в двух страничной карточке с данными для вывода на печать, поэтому так заморачиваюсь с количеством пустых ячеек. Еще раз всем спасибо за внимание.

 

markelovdn

Вот так получилось в итоге

PHP:
  1. echo ‘<table border=1px>’;
  2. echo ‘<th colspan=3>Дата присвоения</th>’;
  3. echo ‘<tr>’;
  4.     for ($i = 0; $row_m = mysqli_fetch_assoc($result_m); $i++){
  5.         if ($i % 3 == 0){
  6.             echo ‘<tr>’;
  7.         }
  8.     echo ‘<td>’.$row_m[‘date_med_insp’].‘</td>’;
  9.         }
  10.     while ($i++ % 3){
  11.         echo ‘<td></td>’;
  12.     }
  13.     echo ‘</tr>’;
  14. // Добавление пустых ячеек до 5 строк
  15.     if($numrows/3<=1){
  16.         for($x=0; $x<4; $x++){
  17.             echo ‘<td>1</td><td>1</td><td>1</td><tr>’;
  18.         }
  19.     } elseif ($numrows/3<=2){
  20.         for($x=0; $x<3; $x++){
  21.             echo ‘<td>1</td><td>1</td><td>1</td><tr>’;
  22.         }
  23.     } elseif($numrows/3<=3){
  24.         for($x=0; $x<2; $x++){
  25.             echo ‘<td>1</td><td>1</td><td>1</td><tr>’;
  26.         }
  27.     } elseif($numrows/3<=4){
  28.         for($x=0; $x<1; $x++){
  29.             echo ‘<td>1</td><td>1</td><td>1</td><tr>’;
  30.         }
  31.     }
  32.        
  33. echo ‘</table>’;

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

 

Drunkenmunky

Выводите выборку в массив. Дополняете его до нужной длины с помощью array_pad()
Разбиваете его на части необходимой длины с помощью array_chunk()

 

roboformation

Должен быть, по-хорошему

 

artoodetoo

Тут есть что улучшить. @Drunkenmunky подсказал один путь, я покажу другой. Покажу схематично, нужен только один цикл:

PHP:
  1. <tr>
  2. <?php for ($i = 1; $i <= 15; $i++): ?>
  3.   <td><?= $x = fetch() ? $x[‘field’] : » ?></td>
  4. <?= $i % 3 || $i == 15 ? » : «</tr>n<tr>n« ?>
  5. <?php endfor; ?>
  6. </tr>
 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *