- PVSM.RU - https://www.pvsm.ru -
Всем привет. Хочу поделиться свеженаписанным генератором HTML таблиц.
Участились случаи сбора различной статистики и компоновки ее в сложные таблицы с различными групировками.
Заметив такую тенденцию решил автоматизировать рисование таблиц.
Как итог:
Собственно сам класс статичный, имеет 1 public метод, который принимает 2 параметра:
Table::write($data, $tableInfo = false);
$data
— сам массив, который предстоит напечатать$tableInfo(опционально)
— массив настроек таблицы
Массив $data
имеет следующую структуру:
Array
(
[0] => Array // 1 строка
(
[0] => Cell_00 // 1 ячейка 1 строки
[1] => Cell_01 // 2 ячейка 1 строки
[2] => Cell_02 // 3 ячейка 1 строки
)
[1] => Array // 2 строка
(
[0] => Cell_10 // 1 ячейка
[1] => Cell_11 // 2 ячейка
[2] => Cell_12 // 3 ячейка
)
);
for($i=0;$i<5;$i++)
for($j=0;$j<5;$j++)
$matrix[$i][$j] = $i.$j;
Но это примеры простейших матриц. Главной особенностью класса является автоматический подсчет rowspan
и группировка данных.
Если вместо строки данных(ячейки) вставить аналогичный массив, то все данные этого подмассива будут помещены в строку родителя:
Array
(
[0] => Array
(
[0] => Cell_00
[1] => Cell_01
[2] => Cell_02
)
[1] => Array
(
[0] => Cell_10
[1] => Cell_11
[2] => Array
(
[0] => Array
(
[0] => Cell_120
)
[1] => Array
(
[0] => Cell_121
)
)
)
)
Чуть глубже:
Array
(
[0] => Array
(
[0] => Cell_00
[1] => Cell_01
[2] => Cell_02
)
[1] => Array
(
[0] => Cell_10
[1] => Array
(
[0] => Array
(
[0] => Cell_110
[1] => Array
(
[0] => Array
(
[0] => Cell_1100
)
[1] => Array
(
[0] => Cell_1101
)
)
)
[1] => Array
(
[0] => Cell_111
[1] => Cell_112
)
)
)
)
Итак, класс умеет автоматически рисовать сложные таблицы и подсчитывать rowspan'ы
. Теперь перейдем к ручной настройке таблицы.
Массив $data
может содержать подмассив ['tableInfo']
— в нем можно указывать различные настройки, в зависимости от его('tableInfo'
) расположения.
Он может находиться:
Array
(
[0] => Array(...)
[1] => Array(...)
...
[n] => Array(...)
[tableInfo] => Array (...)
)
'tableInfo'
расположенный в корне массива позволяет задать общие настройки и параметры для всей таблицы:
Array
(
[rowspan] => false //Отключить автоматическую группировку. Глобальное правило для всей таблицы.
[cols] => Array //Массив колонок
(
[0] => Array
(
[title] => ФИО //title указывает заголовки колонок(выводятся в th).
[key] => name //key указывает какие и в каком порядке выводить ячейки.
)
[1] => Array //title и key независимы друг от друга
( //в массиве cols можно задать только title, можно только key
[title] => Телефон //Но если решили указывать оба правила, то указывайте их попарно для каждой колонки,
[key] => tel //иначе получите нежелательный результат
)
)
//Ряд HTML атрибутов для таблицы:
[id] => tableId
[class] => tableClass
[style] => color:#000;
[args] => align=left width=80% //В args можно указывать любые атрибуты, будут переданы без изменений.
)
Этот же массив можно передать вторым параметром методу:
Table::write($data, $tableInfo = false);
Если используются оба способа одновременно(isset($data['tableInfo'] && isset($tableInfo)
), то в спорных случаях приоритет отдается правилам из второго массива $tableInfo.
array_replace_recursive($data['tableInfo'], $tableInfo);
title
Array
(
[0] => Array
(
[0] => Cell_00
[1] => Cell_01
[2] => Cell_02
)
[1] => Array
(
[0] => Cell_10
[1] => Cell_11
[2] => Cell_12
)
[tableInfo] => Array
(
[cols] => Array
(
[0] => Array
(
[title] => Title 1
)
[1] => Array
(
[title] => Title 2
)
[2] => Array
(
[title] => Title 3
)
)
)
)
key
Array
(
[0] => Array
(
[0] => Cell_00
[1] => Cell_01
[2] => Cell_02
)
[1] => Array
(
[0] => Cell_10
[1] => Cell_11
[2] => Cell_12
[3] => Cell_13 //Будет проигнорирован, т.к. не указан в key
)
[tableInfo] => Array
(
[cols] => Array
(
[0] => Array
(
[key] => 2
)
[1] => Array
(
[key] => 0
)
[2] => Array
(
[key] => 1
)
)
)
)
$exmpl3 = array(
'tableInfo' => array(
'cols' => array(
0 => array('key' => 'cell0'),
1 => array('key' => 'cell1'),
2 => array('key' => 'cell2'),
)
),
0 => array(
'cell0' => 'Cell_00',
'cell2' => 'Cell_02',
'cell1' => 'Cell_01',
),
1 => array(
'cell0' => 'Cell_10',
'sub' => array(
0 => array(
'cell1' => 'Cell_110',
'sub' => array(
0 => array(
'cell2' => 'Cell_1100',
),
1 => array(
'cell0' => 'asdasd_10', //Не будут выведены, т.к. при выводе подмассива
'cell1' => 'asdasd_110',//учитываются только неиспользованные ключи
'cell2' => 'Cell_1101'
)
)
),
'sub' => array('cell1' => 'Cell_111', 'cell2' => 'Cell_112'),
)
)
);
Здесь стоит упомянуть, что если key
вообще не используются, то массив выводимых ключей заполняется всеми ключами ячеек(не подмассивов), которые находятся в этой строке. Например в этом случае:
$exmpl = array(
0 => array(
0 => 'Cell_00',
1 => 'Cell_01',
2 => 'Cell_02',
),
1 => array(
0 => 'Cell_10',
1 => 'Cell_11',
2 => 'Cell_12',
),
);
Для обоих строчек массив $colKeys (массив выводимых ячеек)
будет выглядеть вот так:
$colKeys = array('Cell_00', 'Cell_01', 'Cell_02',);
Array
(
[0] => Array(
[qwe] => йцу
[asd] => фыв
[tableInfo] => Array (...)
)
[1] => Array(...)
...
)
Array
(
[0] => Array(
[qwe] => йцу
[asd] => фыв
[zxc] => Array(
[0] => Array(
[jkl] => олд
[tableInfo] => Array (...)
)
[1] => Array()
)
)
[1] => Array(...)
...
)
расположенный в массиве ячеек, может содержать настройки для строки, в которой он находится и/или настройки для каждой отдельной ячейки:
'tableInfo'
'tableInfo' => array(
'rowspan' => false, //Запретить подсчет rowspan для данной строки
'rowspan' => true, //Разрешить подсчет rowspan для данной строки
'rowspan' => 5, //Указать точное значение rowspan для данной строки
'keys' => array( //Правила по модификации масива выводимых ячеек
'delete' => 'all', //Удалить все ключи выводимых ячеек
'delete' => array('cell2'), //Удалить некоторые ключи(тут 'cell2')
'add' => array('cell3'), //Добавить в конец несколько ключей(тут 'cell3')
'forwarding' => array( //Замена одного ключа на другой. Можно указать несколько правил
0 => array(
'src' => 'cell1', //В этом примере вместо ячейки cell1
'dst' => 'cell2' //Будет выведена ячейка cell2
),
), //Эти правила действуют, даже если вы не указывали явно список ключей для таблицы
), //т.к. в этом случае массив выводимых ячеек будет содержать все ячейки строки
'cells' => array( //Правила для ячеек
'cell2' => array( //Массив правил для ячейки 'cell2'
'rowspan' => false, //Отключить
'rowspan' => true, //Включить
'rowspan' => 5, //Указать точное значение
'colspan' => 6, //Указать ТОЛЬКО точное значение
//Ряд HTML атрибутов для ячейки:
'id' => 'cellId',
'class' => 'cellClass',
'style' => 'color:#000;',
'args' => 'align=left width=80%'
)
),
//Ряд HTML атрибутов для строки:
'id' => 'rowId',
'class' => 'rowClass',
'style' => 'color:#000;',
'args' => 'align=left width=80%'
);
Ну, вот и все. Некоторые моменты решил не рассматривать подробно, если будут вопросы — распишу.
Скачать класс Table [1]
Автор: 0xSS
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/85924
Ссылки в тексте:
[1] Скачать класс Table: https://github.com/fxss/class.table.php
[2] Источник: http://habrahabr.ru/post/253207/
Нажмите здесь для печати.