ФорумПрограммированиеPHP для идиотов → Динамическая генерация таблиц из ini файла

Динамическая генерация таблиц из ini файла

  • xcode

    Сообщения: 1 Репутация: N Группа: Кто попало

    Spritz 19 сентября 2012 г. 13:51

    Привет всем! Помогите пожалуйста в решении одной задачи, я в php новичок, писал только на системных языках.
    Задача следующая : есть ini файл:


    [columns1]

    row1 = "test|type|kg"
    row2 = "test|type|percent"

    [columns2]
    row1= "test2|type|some1"
    row2= "test2|type|some2"
    row2= "test2|type|some2|p10"
    row2= "test2|type|some2|p100"
    row2= "test2|type|some3"

    [columns3]

    ….


    который нужно распарсить и в итоге получить сгенерированную готовую таблицу на выходе примерно следующего типа:


    Я думаю решить эту задачу примерно также как указано здесь :
    http://hashcode.ru/answer_link/18591/
    но пока не совсем представляю как такое реализовать. буду рад любым ответам. Спасибо!
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 19 сентября 2012 г. 15:17, спустя 1 час 26 минут

    [columns1]

    [columns2]

    тебя наебали. таблицы построчно строятся.
    Высокоуровневое абстрактное говно
  • Josh

    Сообщения: 2008 Репутация: N Группа: Кто попало

    Spritz 19 сентября 2012 г. 18:05, спустя 2 часа 48 минут 18 секунд

    xcode, по логике никак
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 20 сентября 2012 г. 6:19, спустя 12 часов 13 минут 50 секунд

    в этом ini нет информации какие именно колонки (или сколько колонок) объединяются. т.е. на этих данных задача не решается.
    надо завести какой-то аналог html <td colspan="x">
    ιιlllιlllι унц-унц
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 20 сентября 2012 г. 10:20, спустя 4 часа 1 минуту 26 секунд


    xcode, по логике никак

    в этом ini нет информации какие именно колонки (или сколько колонок) объединяются. т.е. на этих данных задача не решается.
    надо завести какой-то аналог html <td colspan="x">

    Вы издеваетесь?
    Work, buy, consume, die
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 20 сентября 2012 г. 11:17, спустя 56 минут 31 секунду

    Вы издеваетесь?

    нет )))
    ιιlllιlllι унц-унц
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 20 сентября 2012 г. 11:21, спустя 4 минуты 16 секунд

    Накидал на скорую руку:
    function buildTableHeader($iniFileName)
    {
    $columns = parse_ini_file($iniFileName, true);
    $root = new Column('root');
    $maxDepth = 0;
    foreach ($columns as $name => $cols) {
    $columnRoot = new Column($name, $root);
    foreach ($cols as $colData) {
    $data = explode('|', $colData);
    if (count($data) > $maxDepth) {
    $maxDepth = count($data);
    }
    $current = $columnRoot;
    foreach ($data as $title) {
    if (!$current->hasChild($title)) {
    $current = new Column($title, $current);
    }
    else {
    $current = $current->getChild($title);
    }
    }
    }
    }
    $result = array();
    foreach ($root->getChildren() as $columnRoot) {
    foreach ($columnRoot->getChildren() as $col) {
    $col->walk($result, $maxDepth);
    }
    }
    $str = '';
    foreach ($result as $row) {
    $str .= "<tr>\n";
    foreach ($row as $col) {
    $str .= "\t<th";
    if ($col['colspan'] > 1) {
    $str .= ' colspan="' . $col['colspan'] . '"';
    }
    if ($col['rowspan'] > 1) {
    $str .= ' rowspan="' . $col['rowspan'] . '"';
    }
    $str .= '>' . $col['title'] . "</th>\n";
    }
    $str .= "</tr>\n";
    }
    return $str;
    }

    class Column
    {
    /**
    * @param string $title
    * @param Column $parent
    */
    public function __construct($title, Column $parent = NULL)
    {
    $this->_title = $title;
    $this->_parent = $parent;
    $this->_children = array();
    if ($this->_parent !== NULL) {
    $this->_parent->_children[$title] = $this;
    }
    }

    /**
    * @return integer
    */
    public function getTreeWidth()
    {
    $width = 0;
    foreach ($this->_children as $child) {
    $width += $child->getTreeWidth();
    }
    return $width == 0 ? 1 : $width;
    }

    /**
    * @param string $name
    * @return boolean
    */
    public function hasChild($name)
    {
    return isset($this->_children[$name]);
    }

    /**
    * @param string $name
    * @return Column
    */
    public function getChild($name)
    {
    return $this->_children[$name];
    }

    /**
    * @return Column[]
    */
    public function getChildren()
    {
    return $this->_children;
    }

    /**
    * @param array $result
    * @param integer $maxDepth
    * @param integer $depth
    */
    public function walk(&$result, $maxDepth, $depth = 0)
    {
    $result[$depth][] = array('title' => $this->_title, 'colspan' => $this->getTreeWidth(), 'rowspan' => 1);
    if (!empty($this->_children)) {
    foreach ($this->_children as $child) {
    $child->walk($result, $maxDepth, $depth + 1);
    }
    }
    else if ($maxDepth >= $depth) {
    $result[$depth][count($result[$depth]) - 1]['rowspan'] = $maxDepth - $depth;
    }
    }

    /**
    * @var string
    */
    private $_title;

    /**
    * @var Column[]
    */
    private $_children;

    /**
    * @var Column
    */
    private $_parent;
    }

    $tableHeader = buildTableHeader(__DIR__ . '/test.ini');
    ?><!doctype html>
    <html>
    <head>
    <title>Test</title>
    <style>
    table {
    border-collapse: collapse;
    }
    th, td {
    border: solid black 1px;
    padding: 3px 5px;
    }
    </style>
    </head>
    </html>
    <table>
    <thead>
    <?php echo $tableHeader; ?>
    </thead>
    </table>
    Для файла:
    [columns1]
    row1 = "test|type|kg"
    row2 = "test|type|percent"

    [columns2]
    row1 = "test2|type|some1"
    row2 = "test2|type|some2"
    row3 = "test2|type|some2|p10"
    row4 = "test2|type|some2|p100"
    row5 = "test2|type|some3"

    [columns3]
    row3 = "test3|type"
    Выдаёт
    <!doctype html>
    <html>
    <head>
    <title>Test</title>
    <style>
    table {
    border-collapse: collapse;
    }
    th, td {
    border: solid black 1px;
    padding: 3px 5px;
    }
    </style>
    </head>
    </html>
    <table>
    <thead>
    <tr>
    <th colspan="2">test</th>
    <th colspan="4">test2</th>
    <th>test3</th>
    </tr>
    <tr>
    <th colspan="2">type</th>
    <th colspan="4">type</th>
    <th rowspan="3">type</th>
    </tr>
    <tr>
    <th rowspan="2">kg</th>
    <th rowspan="2">percent</th>
    <th rowspan="2">some1</th>
    <th colspan="2">some2</th>
    <th rowspan="2">some3</th>
    </tr>
    <tr>
    <th>p10</th>
    <th>p100</th>
    </tr>
    </thead>
    </table>
    Только в ini файле нужно имена параметров нужно задавать разными в одной секции
    Work, buy, consume, die
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 20 сентября 2012 г. 11:23, спустя 2 минуты 18 секунд

    кстати, топикстартер бля, каким образом вы обрабатываете свой ini-файл? стандартная функция parse_ini_file() не справится с несколькими одноименными параметрами

    [columns2]
    row1= "test2|type|some1"
    row2= "test2|type|some2"
    row2= "test2|type|some2|p10"
    row2= "test2|type|some2|p100"
    row2= "test2|type|some3"

    в скрипт попадет последний вариант row2
    Спустя 65 сек.
    нях, быстрые у тебя руки )))
    и чего, таки получилось? не верю
    ιιlllιlllι унц-унц
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 20 сентября 2012 г. 11:25, спустя 1 минуту 48 секунд

    нях, быстрые у тебя руки )))

    Дурная голова ногам покоя не даёт
    и чего, таки получилось? не верю

    дак ты пропробуй =)
    Work, buy, consume, die
  • Josh

    Сообщения: 2008 Репутация: N Группа: Кто попало

    Spritz 20 сентября 2012 г. 11:27, спустя 1 минуту 24 секунды

    Nyaah, ты нам предлагаешь в код вникнуть? Хотя да - если придумать алгоритм, то можно, но блять для определенной ситуации только если это будет "позаковырестей" тогда жопа
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 20 сентября 2012 г. 11:30, спустя 3 минуты 46 секунд

    не, ну респект. проверять ломает, проще поверить.
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!