markelovdn
Здравствуйте, подскажите пожалуйста, как вывести три столбца в таблице в цикле while.
PHP:
$query_m =«SELECT date_med_insp FROM `students_medicine` WHERE `ID_students`= ‘».$ID_students.«‘»; echo ‘<table border=1px>’; echo ‘<th colspan=3>Дата присвоения</th>’; echo ‘<tr>’; echo ‘<td>’; echo $row_m[‘date_med_insp’]; echo ‘</td>’; } echo ‘</tr>’; echo ‘</table>’;данный код выводит все что есть массиве в одну строку вот так:
а необходимо что бы с три столбца.
mkramer
Ставиить tr-ки по ходу. Элементарный же алгоритм. Считаем, сколько столбцов вывелось, вывелось три — ставим tr-ку
PHP:
echo ‘<table border=1px>’; echo ‘<tr><th colspan=3>Дата присвоения</th></tr>’; $i = 0; if ($i % 3 === 0) { if ($i !== 0) echo «</tr>»; echo «<tr>»; } echo ‘<td>’; echo $row_m[‘date_med_insp’]; echo ‘</td>’; $i++; } while ($i % 3) { echo «<td></td>»; } echo «</tr>» 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:
$query_m =«SELECT date_med_insp FROM `students_medicine` WHERE `ID_students`= ‘».$ID_students.«‘»; $i = 0; // устанавливаем счётчик echo ‘<table border=1px>’; echo ‘<th colspan=3>Дата присвоения</th>’; echo ‘<tr>’; $i++; if($i%3 == 0){ echo ‘<td>’.$row_m[‘date_med_insp’].‘</td><tr>’; // условие для вывода первого и второго } elseif($i%3 != 0) { echo ‘<td>’.$row_m[‘date_med_insp’].‘</td>’; // условие для самой последней записи } elseif ($i == $numrows) { echo ‘<td>’.$row[‘date_med_insp’].‘</td></tr>’; } } echo ‘</tr>’; echo ‘</table>’;Сначала получаем общее количество значений из базы
Затем, когда при делении получается 0 выводим три записи и ставим tr
Потом если счетчик равен количеству записей из базы выводим последнюю запись.
Правильно?Для меня главное понять как это работает, иначе сюда бы не писал.
А по поводу th внутри tr так получилось, но если я правильно понимаю не должен th быть внутри tr. С версткой приходиться разбираться походу изучения php.Теперь осталось понять как вывести еще две или одну пустую ячейку когда количество записей из базы не делится на 3 без остатка.
Сейчас получается вот так:
artoodetoo
Тебе mkramer показал как, только у него ошибка: в том самом цикле while ($i % 3) для пустых ячеек счётчик $i не увеличивается!
Когда пишешь вслепую, прокручивая программу только в голове, такое случается. А ты старайся понимать, а не копировать.
mkramer
И так сложно было понять почему? Мы тут решения на бегу даём, если что, никто не отлаживает.
— Добавлено —Ну вот для этого и нужен тот цикл, в который я инкремент забыл добавить.
miketomlin
@markelovdn, вы сильно исказили то, что вам показали. По условию внутри осн. цикла нужно только «границу» между строками вставлять.
А второй цикл как раз для дополнения последней строки нужен, о чем выше уже написали.
— Добавлено —PHP:
<table border=1px> <tr> <th colspan=3>Дата присвоения</th> </tr> <tr> <?php endif; ?> <td><?= $row_m[‘date_med_insp’] ?><td> <?php endfor; while ($i++ % 3): ?> <td></td> <?php endwhile; ?> </tr> </table>for можно обратно заменить на while. Просто я показал, как можно инициализировать и инкрементировать счетчик в заголовке цикла. Т.е. длинную строку можно записать так:
PHP:
markelovdn
Многое понял, спасибо за наставления. Все работает, осталось доделать что бы выводилось 5 строк в 3 столбца, даже если из базы выводится 1 значение, остальные будут пустыми, но это уже точно сам доделаю. Это последняя таблица в двух страничной карточке с данными для вывода на печать, поэтому так заморачиваюсь с количеством пустых ячеек. Еще раз всем спасибо за внимание.
markelovdn
Вот так получилось в итоге
PHP:
echo ‘<table border=1px>’; echo ‘<th colspan=3>Дата присвоения</th>’; echo ‘<tr>’; if ($i % 3 == 0){ echo ‘<tr>’; } echo ‘<td>’.$row_m[‘date_med_insp’].‘</td>’; } while ($i++ % 3){ echo ‘<td></td>’; } echo ‘</tr>’; // Добавление пустых ячеек до 5 строк if($numrows/3<=1){ for($x=0; $x<4; $x++){ echo ‘<td>1</td><td>1</td><td>1</td><tr>’; } } elseif ($numrows/3<=2){ for($x=0; $x<3; $x++){ echo ‘<td>1</td><td>1</td><td>1</td><tr>’; } } elseif($numrows/3<=3){ for($x=0; $x<2; $x++){ echo ‘<td>1</td><td>1</td><td>1</td><tr>’; } } elseif($numrows/3<=4){ for($x=0; $x<1; $x++){ echo ‘<td>1</td><td>1</td><td>1</td><tr>’; } } echo ‘</table>’;Понимаю, что слишком много строчек кода для такой задачи, но пока по другому не могу, если кто подскажет вариант короче буду благодарен за науку.
Drunkenmunky
Выводите выборку в массив. Дополняете его до нужной длины с помощью array_pad()
Разбиваете его на части необходимой длины с помощью array_chunk()
roboformation
Должен быть, по-хорошему
artoodetoo
Тут есть что улучшить. @Drunkenmunky подсказал один путь, я покажу другой. Покажу схематично, нужен только один цикл:
PHP:
<tr> <?php for ($i = 1; $i <= 15; $i++): ?> <td><?= $x = fetch() ? $x[‘field’] : » ?></td> <?= $i % 3 || $i == 15 ? » : «</tr>n<tr>n« ?> <?php endfor; ?> </tr>