Пытаюсь нарисовать таблицу, ячейки которой пронумерованы от 1 до 60 (4 столбца и 15 строк). У меня выводит нумерацию как 1 1 1 1 потом 2 2 2 2 и так до 15. Подскажите пожалуйста... PHP: $cols = 4; $rows = 15; echo "<table border=\"1\">"; for($i=1;$i<=$rows;$i++) { echo "<tr>"; for ($z=1; $z<=$cols; $z++){ echo "<td>".$i."</td>"; } echo "</tr>"; } echo "</table>";
математику в школе не надо было прогуливать и экран можно не использовать изменив кавычки: PHP: echo '<table border="1">';
Так а для вывода нумерации колонок почему используешь ту же переменную $i, когда под это дело заточил переменную $z? Но даже если ты заменишь во втором цикле в выводе $i на $z у тебя не получится желаемого. У тебя просто в каждой строчке таблицы будет "1 2 3 4". Нужно менять алгоритм, т.е. у тебя во внутреннем цикле должна быть третья переменная, например $y, которая в самом начале инициализируется $y = 1; и дальше, после каждого вывода в ячейку таблицы, инкрементируется, т.е. $y++. Вот тогда получишь желаемое - сквозную нумерацию всех ячеек таблицы.
Можно даже сэкономить на одной переменной, т.е. не вводить $y, а значения в ячейках формировать как: PHP: ($i - 1) * $cols + $z
да чего мудрить уж =)) PHP: $cols = 4; $rows = 15; $y=1; echo '<table border="1">'; for($i=1;$i<=$rows;$i++) { echo "<tr>"; for ($z=1; $z<=$cols; $z++){ echo "<td>".$y."</td>"; $y++; } echo "</tr>"; }
Или такой вариант ) PHP: $cols = 4; $rows = 15; $i=1; $cell_num = $rows * $cols; echo "<table border='1'>"; while($i <= $cell_num){ if($i == 1) echo "<tr>"; // при первом проходе выводим открывающий тег строки echo "<td>$i</td>"; // собственно выводим ячейку таблицы if(($i % $cols) == 0){ // если $i дошло до значения кратного количеству столбцов, то echo "</tr>"; // закрывающий тег строки if($i < $cell_num) echo "<tr>"; // и тут же открывающий тег строки, кроме самого последнего значения $i, т.к. больше строк не будет } $i++; // инкрементируем $i } echo "</table>";
Я извиняюсь, но при данном подходе есть вероятность того что в таблице может быть кол-во пустых значений в конце таблицы а это не учитывается. Корявая таблица получится в таком случае. Нужно установить сколько надо строк с тегом <tr> - полученное число округлить в большую сторону, а сколько должно быть столбцов мы знаем. Отсюда и рисовать таблицу. $rows - должна быть равна кол-ву записей значит высчитываем переменную скажем $cell_num_tr=ceil($rows/$cols) - мы получили кол-во строк в таблице с учетом даже если последние ячейки будут пустыми. Теперь делаем вывод значений по примеру, при этом учитываем факт того что значение может быть пустым если так то выводим что-то.
Поясните, пожалуйста, откуда такой вывод. В предложенном алгоритме осуществляется проход исключительно по всем ячейкам таблицы, количество которых рассчитано на заданном количестве столбцов и строк. Таким образом, ни одна ячейка не будет пропущена. Далее зачем это устанавливать, если это установлено изначально переменной $rows? Предложенная Вами формула вообще непонятна, что это значит: количество рядов (строк) разделить на количество столбцов? Это что вообще с реальной точки зрения нам дает? Я так понимаю, что Вы немного не разобрались в исходных, изначальных данных, приняв переменную $rows за что-то другое, нежели количество строк (рядов)
FudziKama я же пояснил переменная $rows это количество значений хранящихся в БД. Приведенная мною формула высчитывает сколько в таком случае получится строк у таблицы. Остается только расставить значения по циклам и сделать вывод. А при предыдущем подходе нужно сразу знать сколько строк у таблицы будет.
@victort в том-то и вопрос, что Вы не пояснили этого в своем первом посте, а изначально заявили, что и фактически переиначили задачу. Обратитесь к изначальному вопросу, там четко говорится и предложенное мной решение в точности соответствовало поставленной задаче.
FudziKama то что вы рассчитали в точности исходя из условий это отлично, но мы же с вами программисты а значит должны думать дальше поставленных задач. Если исполнять в точности то что хочет заказчик (в данном случае автор) извини но на практике один и тот же код приходится тогда переписывать постоянно поэтому я привык думать на несколько задач вперед чтобы в дальнейшем не переписывать то что уже написал а если вдруг и переписываю то только в том случае когда нашел решение которое оптимизирует то что я написал раньше. Поэтому я и написал пост указывая что данный подход не является совершенством - и минус заключается в том что кол-во записей может изменится стать больше либо меньше, ну и кол-во столбцов тоже могут в какой-то момент увеличить или уменьшить. В общем в данном случае я просто постарался объяснить минус данного подхода. Ну и если ты доработаешь код то получишь еще один плюс в любой ячейке твое значение может быть равно тогда пустоте просто этой пустоте ты можешь сразу присвоить значение из вне скажем если все значения цифровые то логично присвоить ему 0.
@victort количество записей (строк, рядов) и количество столбцов в коде есть переменные, т.е. если по расширению задачи возникает необходимость как-то их менять, то флаг вам в руки, в целом реализация алгоритма изначальной задачи никак от этого не пострадает. Вы абсолютно некорректно изначально изменили суть переменной $rows и, как следствие, суть постановки задачи и пытаетесь на основании этого вещать, что где-то в реализации есть минусы. В итоге, Вы не минусы объяснили, а, так, любого стороннего читателя сбили с толку, даже не потрудившись объяснить: 1. Откуда вдруг в обсуждаемом коде появляются пустые ячейки, если цикл проходит по всем(!) ячейкам: while($i <= $cell_num) 2. Что это за формула такая Вами приведена $cell_num_tr=ceil($rows/$cols). Если ориентироваться на изначальную суть переменных, то это просто бред "программиста, думающего дальше поставленной задачи". А если это переменные, имеющие иную суть, то хотя бы постараться описать, объяснить, что под ними подразумевается, и тогда самому понять, как от этого изменилась суть задачи. Ну и как заключение: Когда вокруг тебя летает муха, не стоит думать, что на тебя бежит слон. В противном случае, со стороны это покажется если не странностью, то сумасшествием.
Спойлер: два варианта PHP: <?php error_reporting(E_ALL); ini_set('display_errors', 'On'); header('Content-Type: text/html; charset=utf-8'); echo 'Первый вариант <hr />'; // Вывод массива в N-колонок // Исходный массив, который может быть получен и из БД $arr = ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17']; // Количество выводимых колонок $col = 7; // Счётчик итераций $ci = 0; $arr = array_merge($arr , array_fill(count($arr), $col - (count($arr) % $col), '**')); $out = '<table border="1"><tr>'; foreach($arr as $key=>$value) $out .= ($ci++ % $col) ? '<td>' . $arr[$key] . '</td>' : '</tr><tr><td>' . $arr[$key] . '</td>'; $out .= '</tr></table>'; echo $out; echo 'Второй вариант (больше подходит для работы с результатом выборки из БД) <hr />'; // Вывод массива в N-колонок // Исходный массив, который может быть получен и из БД $arr = ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17']; // Количество выводимых колонок $col = 5; // Счётчик итераций $ci = 0; $out = '<table border="1"><tr>'; // Если данные из БД этот цикл легко заменить на while() foreach($arr as $key=>$value) $out .= ($ci++ % $col) ? '<td>' . $arr[$key] . '</td>' : '</tr><tr><td>' . $arr[$key] . '</td>'; foreach(array_fill(count($arr), $col - (count($arr) % $col), '**') as $value) $out .= '<td>' . $value . '</td>'; $out .= '</tr></table>'; echo $out;
FudziKama я написал пост основываясь на практику. Если считаете что я некорректно вас поправил это ваше право. Тот кто будет читать данный пост теперь увидит минусы данного подхода а именно если у него возникнет точно такая же задача и почему-то ваш вариант его не устраивает на 100 % то увидит почему. В общем я предложил улучшить ваш подход вы отказались - ничего страшного я в этом не вижу но тем у кого будет такая же задача я сообщил да и вы подтвердили что данный подход решит только данную задачу но не похожую.
PHP: $cols = 4; $rows = 15; $count = 1; echo '<table border="1">'; for($i = 1; $i <= $rows; $i++) { echo '<tr>'; for ($z = 1; $z <= $cols; $z++) { echo '<td>' . $count++ . '</td>'; } echo '</tr>'; } echo '</table>'; PHP: $cols = 4; $rows = 15; echo '<table border="1">'; for($i = 1; $i <= $rows; $i++) { echo '<tr>'; for ($z = 1; $z <= $cols; $z++) { echo '<td>' . ($z + ($i-1) * $cols) . '</td>'; } echo '</tr>'; } echo '</table>';