Вот изначально ведь хотел написать: PHP: print_r(array_chunk($array,3)); , отсюда и непонимания... Своим предложением я показал лишь возможность простой подготовки данных для последующего (я просто уверен, что задача, как всегда, не точно такая как ее сформулировали в запросе) их использования... А то что данные можно сразу выводить по мере чтения, нарисовал (пусть не совсем так я бы например делал) draak еще на первой странице...
А я своим предложением хотел показать, что в данном случае никакой подготовки данных а) не нужно и б) она только вредит.
Чебурген, посмотрите последнее предложение на первой странице этой темы, за которым и идет мой вариант, и вам сразу станет понятно почему я вообще ввязался в эту тему.
Если это о фразе То себе я сделал почти так. (критика приветсвуется) PHP: <?php $cols = 3; echo '<table>'; do { echo '<tr>'; for ($i=0; $i<$cols; $i++) { echo '<td>' . (($data = mysql_fetch_assoc($result)) ? $data['text'] : '-') . '</td>'; } echo '</tr>'; } while ($data); echo '</table>'; ?>
Отлично. Это даже лучше, чем то, что я предлагал. У меня вместо while был for. для которого надо определять размер данных. А тут - просто шикарный выход из цикла. Единственная проблема - это когда в базе нет ни одной строчки. Но это обычно обходится проверкой и выводом сообщения о том, что нет данных. Ну, или, всё-таки, цикл while .. do, а по отсутствию $data - break А вообще, вчера весь день я хотел написать о том, что преимущество вывода напрямую из мускуля, а не из массива - фикция ;-) Все равно ведь, никто уже давно не выводит данные напрямую, а делает это через шаблон. То есть, массив, все же, нужен. А так же получается, что задача в итоге делится на две: 1. получить массив в удобной форме 2. прописать логику вывода этого масссива в шаблоне. а здесь уже, как мне кажется, подойдут оба подхода. для заполнения массива - функция Vladson-а, ну а вывод - что-то подобное коду avm в синтаксисе любимого шаблонизатора. Тем более, что все пустые места при подготовке заполнены. Хотя... чёрт, что выводить на месте пустых ячеек - это должен писать верстальщик. так что, проверку на пустоту придется в шаблоне писать тоже.
Тогда он выведет один пустой ряд, что в принципе не плохо... Это как раз один из тех случаев когда использование "шаблонизации" заганяет в ступор, с одной стороны это должен решать шаблон, с другой стороны логики в шаблоне быть недолжно...
это ужасно. с точки зрения юзабилити. но если кто-то считает, что пустая строка лучше - пусть делает с ней. это мелочи. тебя обманули. Может быть, и не должно, но она в шаблоне есть. Всегда. Никакого ступора нету. В шаблоне прописывается весь вывод, который производится на странице, и который не содержится в БД. Точка. В противном случае смысл шаблонизации теряется полностью.
Согласен. Надо логику приложения отделять от логики отображения, а не вообще логику от отображения... Но все равно, смарти это зло =) *Холивар*
Это легко обходится Одно дело логика в шаблоне, другое дело логика такого уровня !!! (логика логике рознь) И то и другое элементарно обходится занесением информации не в браузер а в массив (/шаблонизатор) о чём и было не раз упомянуто
Расскажи это авторам и пользователям XSLT. кода они тебе поверят - соглашусь и я. Не раньше. Скрипт заносит в массив только данные из БД. Те данные, которые скрипт не занес, прописываются в шаблоне. в том числе - и содержимое пустых ячеек (к примеру, гифчик "нет информации").
Я не понял мы всё ещё о моём скрипте в 10 строчек говорим или разводим флуд на тему XSLT vs Smarty и.т.д. ? (я не против логики в шаблонах, просто я против сложных конструкций в шаблоне)
Разводим флуд. =) Я считаю, что ошаблонах поговорить полезнее, чем обсасывать три страницы тему "как посчитать до трёх и поставить перевод строки". Если тема интересна посетителям - почему бы её не обсудить? Тем более, что это не флуд, а тема важная и насущная. Ну, во всяком случае - для меня. Вот, тут некоторые считают, что я теоретик. И вот в своей теоретической практике я сталкиваюсь с поддержанием одного и того же скрипта на разных сайтах. поддержка включает в себя периодические обновления. И вот всего пара обновлений привела меня к железобетнному выводу: в коде не прописывается ни одного слова, выводимого на экран. Задача кода - взять данные из бд и натянуть на них шаблон. Весь html, весь, до последней запятой, прописан в шаблоне. В результате для обновления проги мне достаточно залить один и тот же программный модуль на все хосты. И вот это удобство, скажу я тебе, куда важнее, чем теоретические рассуждения о том, что должно быть в шаблоне, а чего - нет.
Тогда не нужно отталкиваться от моего скрипта в 10 строчек в котором while служит и шаблонизатором и шаблоном и логикой одновременно, наличие у него недостатков очевидно... Это известно всем нормальным практикам, только в отличии от теоретиков не многим удаётся этого добиться Именно по этому писать для себя это одно, а на публику это другое. (всегда найдётся хоть кто нибудь кто с тобой не согласен)
Ну, дядя, который присматривает за оформительской частью сайтов, и клепает новые, будучи дизайнером до мозга костей, как-то справляется с логикой в шаблонах. Даже с мелкой. поскольку он давно понял - если логики не будет в шаблоне, то она уедет в скрипт. А скрипты его пугают гораздо больше. Как и то, что оформление вместе со скриптом перезапишется.
PHP: <?php function html_table($jloop, $cols = 3, $rows = 3, $table_attr = 'border="1"', $tr_attr = '', $td_attr = '', $trailpad = ' ', $vdir = 'down', $hdir = 'right', $inner = 'cols') { $params['loop'] = $jloop; if (!isset($params['loop'])) { echo("html_table: missing 'loop' parameter"); return; } foreach ($params as $_key=>$_value) { switch ($_key) { case 'loop': $$_key = (array)$_value; break; case 'cols': case 'rows': $$_key = (int)$_value; break; case 'table_attr': case 'trailpad': case 'hdir': case 'vdir': case 'inner': $$_key = (string)$_value; break; case 'tr_attr': case 'td_attr': $$_key = $_value; break; } } $loop_count = count($loop); if (empty($params['rows'])) { /* no rows specified */ $rows = ceil($loop_count/$cols); } elseif (empty($params['cols'])) { if (!empty($params['rows'])) { /* no cols specified, but rows */ $cols = ceil($loop_count/$rows); } } $output = "<table $table_attr>\n"; for ($r=0; $r<$rows; $r++) { $output .= "<tr" . html_table_cycle('tr', $tr_attr, $r) . ">\n"; $rx = ($vdir == 'down') ? $r*$cols : ($rows-1-$r)*$cols; for ($c=0; $c<$cols; $c++) { $x = ($hdir == 'right') ? $rx+$c : $rx+$cols-1-$c; if ($inner!='cols') { /* shuffle x to loop over rows*/ $x = floor($x/$cols) + ($x%$cols)*$rows; } if ($x<$loop_count) { $output .= "<td" . html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n"; } else { $output .= "<td" . html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n"; } } $output .= "</tr>\n"; } $output .= "</table>\n"; return $output; } function html_table_cycle($name, $var, $no) { if(!is_array($var)) {$ret = $var;} else {$ret = $var[$no % count($var)];} return ($ret) ? ' '.$ret : ''; } ?> Пример использования - выведит массив - в три колонки - ...хз что - с атрибутом border="1" - tr атрибуты - td атрибуты - с "..." в пустых ячейках если такие будут - выравнивание вниз - направления масива свреху вниз - направление массива направо - читаем таблица по строкам (можно и rows) <?php // Сами данные $array = array(1, 2, 3, 4, 5, 6, 7, 8); echo html_table($array, 3, 0, "border='1'", "", "", "...", "down", "right", "cols") ?>