[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод информации в таблицу
kirik
Довольно частый вопрос, поэтому пришла идея объеденить те 2 скрипта (один, два).

Итак у нас есть два вида вывода информации в таблицу: горизонтальный и вертикальный (назовем их так).
Горизонтальный:
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |

Вертикальный:
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |

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

Код и примеры
Функция для вывода данных в горизонтальном направлении
PHP
function drawTableH($data, $columns=10, $tabs=0)
{
    $tbl = null;

    if($tabs === false)
    {
        $tr = $td = null;
    }
    else
    
{
        $tr = "\n".str_repeat("\t", $tabs);
        $td = $tr."\t";
    }

    for($i = 0, $n = 1, $d = ceil(count($data) / $columns) * $columns; $i < $d; $i++, $n++)
    {
        if($n == 1)
            $tbl .= $tr.'<tr>';

        $tbl .= $td.'<td>'.(isset($data[$i]) ? $data[$i] : '&nbsp;').'</td>';

        if($n == $columns)
        {
            $n = 0;
            $tbl .= $tr.'</tr>';
        }
    }

    if($tabs !== false)
        $tbl .= "\n";

    return $tbl;
}

Функция для вывода данных в вертикальном направлении
PHP
function drawTableV($data, $columns=10, $tabs=0)
{
    $tbl = null;

    if($tabs === false)
    {
        $tr = $td = null;
    }
    else
    
{
        $tr = "\n".str_repeat("\t", $tabs);
        $td = $tr."\t";
    }

    $all_columns = array_chunk($data, ceil(count($data) / $columns));
    for($i = 0, $c = count($all_columns[0]); $i < $c; $i++)
    {
        $tbl .= $tr.'<tr>';

        for($si = 0; $si < $columns; $si++)
        {
            $tbl .= $td.'<td>'.(isset($all_columns[$si][$i]) ? $all_columns[$si][$i] : '&nbsp;').'</td>';
        }

        $tbl .= $tr.'</tr>';
    }

    if($tabs !== false)
        $tbl .= "\n";

    return $tbl;
}

И то и другое в одном горшке
PHP
// параметр $type отвечает за направление 1 - вертикально, все остальное - горизонтально.
function drawTable($data, $type=1, $columns=10, $tabs=0)
{
    $tbl = null;

    if($tabs === false)
    {
        $tr = $td = null;
    }
    else
    
{
        $tr = "\n".str_repeat("\t", $tabs);
        $td = $tr."\t";
    }

    if($type == 1)
    {
        $all_columns = array_chunk($data, ceil(count($data) / $columns));
        for($i = 0, $c = count($all_columns[0]); $i < $c; $i++)
        {
            $tbl .= $tr.'<tr>';

            for($si = 0; $si < $columns; $si++)
            {
                $tbl .= $td.'<td>'.(isset($all_columns[$si][$i]) ? $all_columns[$si][$i] : '&nbsp;').'</td>';
            }

            $tbl .= $tr.'</tr>';
        }
    }
    else
    
{
        for($i = 0, $n = 1, $d = ceil(count($data) / $columns) * $columns; $i < $d; $i++, $n++)
        {
            if($n == 1)
                $tbl .= $tr.'<tr>';

            $tbl .= $td.'<td>'.(isset($data[$i]) ? $data[$i] : '&nbsp;').'</td>';

            if($n == $columns)
            {
                $n = 0;
                $tbl .= $tr.'</tr>';
            }
        }
    }

    if($tabs !== false)
        $tbl .= "\n";

    return $tbl;
}


Пример:
(параметры в обеих функция одинаковые, отличается лишь направление заполнения таблицы)
Возьмем за данные массив чисел:
PHP
$data = range(1, 43);

пример для тех, кто выводит данные из БД
PHP
$data = array();
$query = mysql_query('SELECT `column1`, `column2`, `column3` FROM `table` ORDER BY `field` DESC');
while(
$row = mysql_fetch_row($query))
{
    $data array_merge($data$row);
}
mysql_free_result($query);

Для того чтобы нарисовать табличку в 3 колонки:
PHP
// Для горизонтального вывода
echo '<table>'.drawTableH($data, 3, 0).'</table>';
    // или так для общей функции
    echo '<table>'.drawTable($data, 0, 3, 0).'</table>';
// Для вертикального вывода
echo '<table>'.drawTableV($data, 3, 0).'</table>';
    // или так для общей функции
    echo '<table>'.drawTable($data, 1, 3, 0).'</table>';

Число "0" в примерах (параметр $tabs) означает количество отступов в форматировании кода. Если не хотим красивостей, ставим false вместо нуля, и выводим таблицу в одну строку.

Вот и сказочке конец, кто не слушал, тот сам виноват wink.gif

Там если ошибки найдете, иль дополнения какие будут, говорите smile.gif



Спустя 6 месяцев, 5 дней, 12 часов, 55 минут, 38 секунд (12.02.2010 - 17:30) Guest написал(а):
пишет Division by zero

Спустя 17 секунд (12.02.2010 - 17:30) Guest написал(а):
в строке 28

Спустя 1 минута, 53 секунды (12.02.2010 - 17:32) Guest написал(а):
а у тебя же три параметра в функции,почему то три то четыре?

Спустя 2 часа, 5 минут, 44 секунды (12.02.2010 - 19:38) Michael написал(а):
Цитата (Guest @ 12.02.2010 - 16:32)
а у тебя же три параметра в функции,почему то три то четыре?

Там функции разные, присмотрись.

Спустя 2 часа, 33 минуты, 17 секунд (12.02.2010 - 22:11) Gokusa написал(а):
а чем такой вариант плох?
или я не понял чего то в условии задачи?

function table($data,$kol)
{
echo '<table>';


$k=sqrt($kol);
$k=ceil($k);
$k1=0;
for ($i=0;$i<$k;$i++)
{

echo '<tr>';
for ($j=0;$j<$k;$j++,$k1++)
if ($k1<$kol)
{echo '<td>'.$data[$k1].'</td>';}
'</tr>';
}
echo '</table>';
}
$data=range(1,43);
table($data,10,3,3);

?>

Спустя 1 месяц, 3 дня, 16 часов, 21 минута, 53 секунды (16.03.2010 - 14:33) Evilsoul написал(а):
Какая-то хрень непонятная smile.gif
Разбираюсь со скриптом "горизонтальной загрузки".
После открытого тега <td> ставится непонятный символ в блокноте это выглядит как прямоугольник, в дримвьювере и нотепаде++ это непонятная "верхняя" точка, здесь это:
1. - JAVA code;
<td>&#65279;<div >


2. - PHP code;
<td>&#65279;<div >


3. - SQL code;
<td>&#65279;<div >


4. - HTML code;
<td><div >


5. - CSS code;
<td>&#65279;<div >


6. - CODE;
<td><div >



Будьте любезны, подскажите, что это?

Спустя 5 минут, 6 секунд (16.03.2010 - 14:38) Evilsoul написал(а):
Появилось подозрение что это кодировка... сейчас попробую выяснить.

Спустя 39 минут, 25 секунд (16.03.2010 - 15:18) Evilsoul написал(а):
Вообщем я так и не узнал к чему оно точно относится (то ли HTML то ли кодировка) но убрал я эту беду так:
return str_replace('', '', $tbl);

символ здесь не отображается а скопировать его можно с программ которыми вы работаете.

Спустя 5 дней, 5 часов, 21 минута, 25 секунд (21.03.2010 - 20:39) nikolas написал(а):
Спасибо! нашел то что искал, но не долго музыка играла, столкнулся с трудностями которые не могу преодолеть, уже передумал и перепробывал все что в моих возможностях мне так кажеться.
Так вот есть в БД таблица
код
-- Table structure for table `cat`
--

CREATE TABLE IF NOT EXISTS `cat` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

--
-- Dumping data for table `cat`
--

INSERT INTO `cat` (`id`, `title`) VALUES
(1, 'test1'),
(2, 'test2'),
(3, 'test3'),
(4, 'test4');

дальше
$result = [SPAN=darling]my[SPAN=darling]sql[/SPAN][/SPAN]_query("SELECT * FROM cat", $db) or die("MySQL Error: ".[SPAN=darling]my[SPAN=darling]sql[/SPAN][/SPAN]_error());

$data = array();

while($row = [SPAN=darling]my[SPAN=darling]sql[/SPAN][/SPAN]_fetch_row($result))
{
$data = array_merge($data, $row);
}
[SPAN=darling]my[SPAN=darling]sql[/SPAN][/SPAN]_free_result($result);


function drawTableH($data, $columns=10, $tabs=0)
{
$tbl = null;


for($i = 0, $n = 1, $d = ceil(count($data) / $columns) * $columns; $i < $d; $i++, $n++)
{
if($n == 1)
$tbl .= $tr.'<tr>';

$tbl .= $td.'<td>'.(isset($data[$i]) ? $data[$i] : ' ').'</td>';

if($n == $columns)
{
$n = 0;
$tbl .= $tr.'</tr>';
}
}


return $tbl;
}

// Вывод
echo '<table width="100%" border="1" cellpadding="6" cellspacing="0">'.drawTableH($data, 2, 0).'</table>';

выводить и id и title в каждом отдельном td
можно поменять SELECT * FROM cat на SELECT title FROM cat, выводит прекрасно все но мне как бы нужно вывести в цикле в одной ячейке таблицы и id и title , title вывести, неважно что выводить там id или дополнительное какое нибудь поле например short_desc , ведь мы сдеся объединяем масивы $data = array_merge($data, $row); как я понял, какие есть варианты решений чтоб вывести типа
echo $row ['title'];
вместо
.(isset($data[$i]) ? $data[$i] : ' ').
и воопше как эта строка работает что вместо не могу подставить больше ниче? Помогите разобраться как решить эту проблему!

Спустя 5 часов, 40 минут, 36 секунд (22.03.2010 - 02:20) nikolas написал(а):
что значит
.(isset($data[$i]) ? $data[$i] : ' ').
разобрался , выходит если у нас существует (TRUE) переменная $data[$i] то выводим $data[$i] если FALSE то выводим &nbsp; пробел что у нас были заполнены недостающие td, чтоб таблица была такая как надо, но как всежтаки в переменную $data[$i] всунуть сюда вывод например типа
echo "
<p><a href='view_article.php?id="
.$row['id']."'>".$row["title"]."</a></p>
<p>"
.$row["date"]."</p>
<p>"
.htmlspecialchars($row["title"])."</p>";

???????????????

Спустя 13 часов, 27 минут, 38 секунд (22.03.2010 - 15:47) nikolas написал(а):
реакции ноль, хоть бы послали куда нибудь для приличия, ни хазяин темы даже на свою тему не подписался или помочь желания нету, написано класно но реального применения нету, я ж не прошу решения, но навести в правильном направление хотя б бы куда рыть, каким способом хоть можно решать, тему новую не создавал как есть уже поднятая, а надо было! никто ж не замечает тут. sad.gif

Спустя 2 месяца, 15 дней, 2 часа, 14 минут, 58 секунд (7.06.2010 - 17:02) Fire-Night написал(а):
Всё работает на ура. Спасибо. =)

Спустя 1 месяц, 16 часов, 42 минуты, 53 секунды (8.07.2010 - 09:45) Guest написал(а):
Спасибо!

Спустя 5 дней, 9 часов, 5 минут, 37 секунд (13.07.2010 - 18:51) Guest написал(а):
Вы хоть проверяете свои скрипты перед выкладыванием? Автор, выолни такой вызов и вместо 4 колонок только 3

$data = range(1, 9);
echo '<table>'.drawTableV($data, 4, 0).'</table>';

Спустя 3 месяца, 5 дней, 23 часа, 57 минут, 26 секунд (19.10.2010 - 18:48) kirik написал(а):
Цитата (Guest @ 13.07.2010 - 10:51)
вместо 4 колонок только 3

А вы сами смотрели вывод? Там 4 колонки, только они пустые.

Спустя 6 месяцев, 13 дней, 48 минут (2.05.2011 - 19:36) argentines написал(а):
Доброе время сток
я сталкнулся с той же проблемой мне необходимо вывести три ячейки в ряд горизонтально
не могу не получается дело в том что я вывожу цикл через функцию а в индексном через форич
вот код правда даже немагу догодатся куда его можно вставить
вот моя функция:

function main(){

$result = mysql_query("SELECT books.min_img, books.id_book, authors.author
FROM authors, books_to_author, books
WHERE authors.id_author = books_to_author.id_author
AND books_to_author.id_book = books.id_book"
);
if(mysql_num_rows($result)>0)
{

while($myrow = mysql_fetch_array($result))
{

$main[$myrow[id_book]] = $myrow;

}
return $main;
}
else
{
echo"<p>The inquiry about sample of the data has not selected</p>";
exit(mysql_error());
}
}



а вот форич:

<?
$author = $_GET[id_author];
$genre = $_GET[id_genre];

if(empty($author)){
if(empty($genre))

foreach($main as $key=> $val)

{
echo"
<table width=600 height=200 >
<tr>
<td style = 'width:150px;border:1px solid gray;'><img src = '
$val[min_img]' hspace='55' vspace='8' class='img_view'><br />$val[author]</td>

</tr>
</table>"
;
}
}

?>

подскажи как я могу вывести в форыче три ячейки в горизонте
1 | 2 | 3
4 | 5 | 6

Спустя 2 часа, 32 минуты, 40 секунд (2.05.2011 - 22:09) Игорь_Vasinsky написал(а):
argentines
ну вот зачем дублировть в чужой теме, да ещё так безцеремонно (тема прикреплена) ?


Есть же отклики и в вашей теме. blink.gif

Спустя 18 дней, 1 час, 13 минут, 9 секунд (20.05.2011 - 23:22) argentines написал(а):
Цитата (Lenin @ 20.05.2011 - 20:12)
Помогите со скриптом...........................очень нужно((((((((( :( :( :( :( :( :( :(

$names = array('Иванов' => 'Андрей',
'Петров' => 'Владимир',
'Сидоров' => 'Инокентий',
'Путин' => 'Володька',
'Медведев' => 'Димка',
'Тимошенко' => 'Юлька');
$table = '<table width=200 height=200><tr>';
$x = 0;

foreach($names as $key=> $val)
{
if(!($x % 3) && $x != 0) { $table .= '</tr><tr>'; }
$table .= '<td>'. $val .' '. $key .'</td>';
$x++;
}

$table .= "</tr></table>";

echo $table;

вот мне помогли я тебе даю

Спустя 8 дней, 17 часов, 56 минут, 53 секунды (29.05.2011 - 17:19) dgalexei написал(а):
Хах... http://www.linkexchanger.su/2010/118.html посмотрите! по моему идеальный вариант если хотите быстро и красиво... есть возможность редактирования, поиска по табл., удаления, добавления советую использовать для выводы дааных из БД... в общем посмотрите!!!

Спустя 9 месяцев, 15 дней, 1 час, 18 минут, 57 секунд (14.03.2012 - 18:38) гинеколог написал(а):
Составляю файл php из двух (Header и Footer) А между ними таблица (основной текст. Вроде как шаблон создал шапки и панели навигации сайта. Но содержимое таблички (текст) сдвигает границы таблицы (ячейки) что делать?

Спустя 1 час, 48 минут, 57 секунд (14.03.2012 - 20:27) inpost написал(а):
1. Повзрослеть.
2. Создать в разделе HTML, так как вопрос об верстке.
3. Создать свою тему, так как тут отвечаем мы АВТОРУ, а не тебе.

Спустя 22 минуты, 25 секунд (14.03.2012 - 20:49) Игорь_Vasinsky написал(а):
Свернутый текст
laugh.gif laugh.gif laugh.gif laugh.gif ещё одна социальная сеть в разработке.

Спустя 1 год, 7 месяцев, 21 день, 19 часов, 26 минут, 51 секунда (6.11.2013 - 16:16) dr.nomore написал(а):
Освежую тему. Насмотрелся на мучения новичков с рендером таблиц из бд, а между тем все очень просто.

Как нарисовать таблицу по результату _любого_ запроса в пять строк:

$link = new mysqli($host, $user, $pass, $dbname, $port, $sock);

echotable($link->query("select * from my_table"));

function echotable($result) {
$table = array();
$table[] = '<table><tr style="font-weight:bold">';
while($field = $result->fetch_field()) $table[] = '<td>' . $field->name;
while($row = $result->fetch_row()) $table[] = '<tr><td>' . join('<td>', $row);
echo join(PHP_EOL, $table) . '</table>';
}


Для человеко-читаемых заголовков готовим их в запросе. Муторно, зато вывод мгновенный.

$q = 'select 
prod_id Код_товара,
prod_name Наименование,
prod_kind Вид_товара,
some_other_field Еще_поле_из_бд
from
my_table as Товары'
;


Далее по тексту выше. Чтобы заголовки - псевдонимы полей были без прочерков (они нужны чтобы не тикать идентификаторы), добавляем к $field->name; str_replace('_', '', $field->name);

Микроскопическая функция имеет огромный потенциал. Ее можно развивать и наращивать потому что в результе есть все что требуется для рендера полноценной, интерактивной таблицы.

Спустя 28 минут, 32 секунды (6.11.2013 - 16:45) dr.nomore написал(а):
Для повернутой "набок" таблицы придется транспозить массив данных.

Коннект... запрос...

function echotable90($result) {

$table = array();

while($field = $result->fetch_field()) $table[$field->name] = array();
while($row = $result->fetch_assoc()) foreach($row as $key => $value) $table[$key][] = $value;

echo '<table>';
foreach($table as $name => $values)
echo '<tr><td style="font-weight:bold">' . $name . '<td>' . join('<td>' . $values);
echo '</table>'
}


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

В обоих случаях можно обойтись одной переменной и для полей и для строк. Но разные имена семантически понятнее.

Самая мякотка "повернутой" таблицы в том, что ограничив запрос одной строкой (LIMIT 1) вы влегкую получите типичную для показа товара таблицу вида:
Артикул 093833
Наименование Баян
Размер 90Х60Х90

Спустя 7 часов, 52 минуты, 43 секунды (7.11.2013 - 00:37) Aeq написал(а):
Цитата (dr.nomore @ 6.11.2013 - 17:16)
Освежую тему. Насмотрелся на мучения новичков с рендером таблиц из бд, а между тем все очень просто.

Как нарисовать таблицу по результату _любого_ запроса в пять строк:

$link = new mysqli($host, $user, $pass, $dbname, $port, $sock);

echotable($link->query("select * from my_table"));

function echotable($result) {
$table = array();
$table[] = '<table><tr style="font-weight:bold">';
while($field = $result->fetch_field()) $table[] = '<td>' . $field->name;
while($row = $result->fetch_row()) $table[] = '<tr><td>' . join('<td>', $row);
echo join(PHP_EOL, $table) . '</table>';
}


Для человеко-читаемых заголовков готовим их в запросе. Муторно, зато вывод мгновенный.

$q = 'select 
prod_id Код_товара,
prod_name Наименование,
prod_kind Вид_товара,
some_other_field Еще_поле_из_бд
from
my_table as Товары'
;


Далее по тексту выше. Чтобы заголовки - псевдонимы полей были без прочерков (они нужны чтобы не тикать идентификаторы), добавляем к $field->name; str_replace('_', '', $field->name);

Микроскопическая функция имеет огромный потенциал. Ее можно развивать и наращивать потому что в результе есть все что требуется для рендера полноценной, интерактивной таблицы.

а зачем, простите, при рендере таблицы, засовывать все в массив строк, и потом все это сувать в еще одну строку, которую потом выводить? А если результирующая табличка должна получиться over 9000 строк, вам не жалко памяти? Лучше сразу в echo выводить и про запятые не забывать ))

Спустя 1 день, 2 часа, 11 минут, 1 секунда (8.11.2013 - 02:48) dr.nomore написал(а):
Затем что тег table может быть внутри тега div который внутри тега div который внутри тега body который внутри тега html.

Спустя 8 дней, 2 часа, 45 минут, 41 секунда (16.11.2013 - 05:34) dr.nomore написал(а):
Рендер связанных данных в таблицу. На входе массив вида

array['left_col'] = array(0=>right_col1, 1=>right_col2 ...);


$table = array();
foreach($arr as $country => $cities) { // $cities === массив городов страны $country
$table[] = '<tr><td rowspan="' . count($cities) . '">' . $country;
$table[] = '<td>' . join('<tr><td>', $cities);
}
echo '<table><tr><th>Country<th>City' . join(PHP_EOL, $table) . '</table>';


Спустя 1 месяц, 3 дня, 21 час, 8 минут, 31 секунда (20.12.2013 - 02:43) Outum написал(а):
Ребят! прошу помощи!
я начинающий программист и мне нужна ваша помощь! гляньте код(представлен ниже) есть инкремент по нечётным строкам массива и декремент по чётным, нужно что бы числа шли змейкой сверху вниз. скажите пожалуйста почему не работает декремент? по идее ведь он должен идти с конца строки в начало, так?


<?
print("<table border=1><tr>");
$m=1;

for($i=0;$i<=6;$i++)
{if($i%2==0)
{for ($j=0;$j<=6;$j++)
{print("<td>".$m."</td>");
$m++;
}
print "</tr>"."<tr>";
}
else
{for($j=6;$j>=0;$j--)
{
print"<td>".$m."</td>";
$m++;

}
print "</tr>";
}
}

?>

Спустя 1 месяц, 4 дня, 9 часов, 17 минут, 22 секунды (24.01.2014 - 12:00) artem328 написал(а):
Добрый день!

Прошу подсказать, как можно сделать так. Попытаюсь объяснить на пальцах:

БД

id(int) | value1(char) | value2(char) | title(char) |
-------------------------------
1 | value1[1] | value2[1] | title[1] |
-------------------------------
2 | value1[2] | value2[2] | title[1] |
-------------------------------
3 | value1[3] | value2[3] | title[2] |
-------------------------------
4 | value1[4] | value2[4] | title[2] |


Нужно чтоб, в HTML создавалась подобная структура с помощью цикла


title[1]
--------------------
value1[1] | value 2[1]
--------------------
value1[2] | value 2[2]
--------------------

title[2]
--------------------
value1[3] | value 2[3]
--------------------
value1[4] | value 2[4]
--------------------

Я делал цикл по этому уроку http://ru.html.net/tutorials/php/lesson20.php (что в принципе похоже на то что в сообщение ТС). И у меня все получилось, как там. Но чтоб получались таблицы как я описал выше не знаю что сделать.

Я думал что можно вложить цикл в цикл, но что-то не выходило у меня. Может я не соображу, как написать данный цикл.

Надеюсь на вашу помощь.

Заранее спасибо

Спустя 4 минуты, 3 секунды (24.01.2014 - 12:04) Игорь_Vasinsky написал(а):
наверно нужно сформировать массив ввида

title1=>array(
array(
value1-1,value2-1
)
array(
value1-2,value2-2
)

)


а потом уж в цикле формировать html
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.