Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
virusnyak333
20 / 20 / 0
Регистрация: 09.11.2014
Сообщений: 70
1

Как вывести таблицу в виде иерархии?

04.07.2016, 17:31. Просмотров 830. Ответов 4
Метки нет (Все метки)

есть база
|id|url|category|
-------------------
0|rrr|no|
1|test|no|
2|blabla|test|
3|mr|test|
4|ml|blabla|

Как можно вывести в виде иерархии ? пример для этой таблицы. (no - нет категории)

HTML5
1
2
3
4
5
6
7
8
9
10
11
<ul>
 <li>0 - rrr</li>
 <li>1 - test</li>
   <ul>
    <li>2 - blabla</li>
        <ul>
            <li>4 - ml</li>
        </ul>
    <li>3 - mr</li>
   </ul>
</ul>
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2016, 17:31
Ответы с готовыми решениями:

Как вывести из базы данные в таблицу в виде зебры(см.фото)
Здравствуйте,помогите сделать так,что бы из данные из базы выводились в таблицу...

Вывести таблицу из CSV файла в виде HTML таблицы
Всем привет. Помогите разобраться пожалуйста. Надо вывести таблицу из CSV...

Как вывести в нужном виде?
Всем привет. Есть такой код: &lt;?php $aa = array(0.322, 0.277, 0.110, 0.060,...

Как вывести в нормальном виде данные ?
Есть такой файл example.php &lt;?php require_once(&quot;ipgeobase.php&quot;); $gb = new...

Как правильно вывести на странице запрос в виде таблице из двух колонок
Как правильно вывести на странице запрос в виде таблице из двух...

4
полудух
148 / 163 / 43
Регистрация: 15.03.2016
Сообщений: 999
04.07.2016, 18:56 2
рекурсивной ф-ей со вставкой <ul><li></li></ul>
0
Max Dark
шКодер самоучка
1968 / 1745 / 860
Регистрация: 09.10.2013
Сообщений: 3,854
Записей в блоге: 6
Завершенные тесты: 2
04.07.2016, 19:04 3
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
/**
 * @file https://gist.github.com/max-dark/f39028cc106ed32e8ce1b55a11643b43
 */
 
define('ROOT_NODE', null);
define('LINK', 'id');
define('NODE_TITLE', 'title');
define('PARENT_LINK', 'parent_id');
define('CHILD_NODES', 'child');
 
/**
 * восстанавливает дерево по таблице связей
 * @param array $data
 * @return array
 */
function restore_tree($data)
{
    $lst = prepare_parents($data);
 
    restore_tree_impl($lst[ROOT_NODE], $lst);
    return $lst[ROOT_NODE];
}
 
/**
 * восстановление связей родитель->дети
 * @param array $parent
 * @param array $data
 * @return void
 */
function restore_tree_impl(&$parent, &$data) {
    foreach ($parent[CHILD_NODES] as &$child) {
        // Если текущий ребенок сам является родителем
        if (array_key_exists($child['id'], $data)) {
            // восстановить связь
            $child[CHILD_NODES] = $data[$child['id']][CHILD_NODES];
            // проверить детей
            restore_tree_impl($child, $data);
        } else {
            $child[CHILD_NODES] = [];
        }
    }
}
function make($id) {
    return ['id' => $id, NODE_TITLE => '[root]', CHILD_NODES => []];
}
/**
 * Создает список узлов, имеющих датей
 * @param array $data
 * @return array
 */
function prepare_parents($data) {
    $res = [];
    foreach ($data as $item) {
        $parent = $item[PARENT_LINK];
        if (!array_key_exists($parent, $res)) {
            $res[$parent] = make($parent);
            if (array_key_exists($parent, $data)) {
                $res[$parent][NODE_TITLE] = $data[$parent][NODE_TITLE];
            }
        }
        unset($item[PARENT_LINK]);
        array_push($res[$parent][CHILD_NODES], $item);
    }
    return $res;
}
 
function show($item, $level) {
    if ($item['id'] === ROOT_NODE) return;
    while ($level --> 0) {
        echo '..';
    }
    echo $item[NODE_TITLE].PHP_EOL;
}
 
function print_tree($data, $level = -1) {
    show($data, $level);
    foreach ($data[CHILD_NODES] as $item) {
        print_tree($item, $level + 1);
    }
}
 
/*
$data = [
    ['id'=>0, NODE_TITLE=>'Электроника', PARENT_LINK => null],
    ['id'=>1, NODE_TITLE=>'Компьютеры', PARENT_LINK => 0],
    ['id'=>2, NODE_TITLE=>'ПК', PARENT_LINK => 1],
    ['id'=>3, NODE_TITLE=>'Ноутбуки', PARENT_LINK => 1],
    ['id'=>4, NODE_TITLE=>'Мобильные телефоны', PARENT_LINK => 0],
    ['id'=>5, NODE_TITLE=>'Бытовая химия', PARENT_LINK => null],
    ['id'=>6, NODE_TITLE=>'Порошок', PARENT_LINK => 5],
    ['id'=>7, NODE_TITLE=>'Мыло', PARENT_LINK => 5],
    ['id'=>8, NODE_TITLE=>'Трансформеры', PARENT_LINK => 3],
];
*/
 
$data = [
    ['id' => 0, 'url' => 'rrr',    'category' => 'no'],
    ['id' => 1, 'url' => 'test',   'category' => 'no'],
    ['id' => 2, 'url' => 'blabla', 'category' => 'test'],
    ['id' => 3, 'url' => 'mr',     'category' => 'test'],
    ['id' => 4, 'url' => 'ml',     'category' => 'blabla']
];
 
$links = get_links($data);
 
// преобразование элемента в подходящую структуру
function convert($item) {
    global $links;
    return [
        'id'        => $item['id'],
        NODE_TITLE  => $item['url'],
        PARENT_LINK => $links[$item['category']]
    ];
}
 
// получение ссылок на родителей
function get_links($data) {
    $tmp = array_flip(
        array_map(
            function ($item) { return $item['url']; },
            $data
        )
    );
    $tmp['no'] = ROOT_NODE;
    return $tmp;
}
 
$root = restore_tree(
    array_map('convert', $data)
);
 
print_tree($root);
2
WhiteMind
Hello Kitty
680 / 554 / 400
Регистрация: 12.02.2016
Сообщений: 1,440
Записей в блоге: 1
04.07.2016, 20:43 4
Лучший ответ Сообщение было отмечено virusnyak333 как решение

Решение

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
 
class NodeEach {
    private $parent;
    private $children;
    private $shutdown;
    public function __construct( $parent , $children , $callback ) {
        if ( !$children ) { return; }
 
        $this->parent = $parent;
        $this->children = $children;
        
        for($this->children = $this->parent->children; 
            $this->children->prev;
            $this->children = $this->children->prev);
 
        $this->shutdown = false;
        for(; !$this->shutdown && $this->children; $this->children = $this->children->next) {
            $callback($this->children,$this);
        }
    }
    public function Stop() { $this->shutdown = true; }
    public function Prev() { if ( isset($this->children->prev) ) { $this->children=$this->children->prev; } }
    public function Next() { if ( isset($this->children->next) ) { $this->children=$this->children->next; } }
}
abstract class Node {
    public $parent;
    public $children;
    public $prev;
    public $next;
    public $params;
 
    public function IsParent() { return !!$this->parent; }
    public function IsChildren() { return !!$this->children; }
    public function GetChildrenCount() {
        if ( !$this->IsChildren() ) { return 0; }
        $i=0; $this->EachChildren(function() use(&$i) { $i++; });
        return $i;
    }
 
    public function EachChildren( $callback ) {
        new NodeEach($this, $this->children, $callback);
    }
    
    public function AppendChildren( $node ) {
        $node->parent = $this;
        if ( !$this->IsChildren() ) { $this->children = $node; return; }
        $this->EachChildren(function($c, $each) use($node) {
            if ( !$c->next ) { 
                $c->next = $node;
                $node->prev = $c;
                $each->Stop();
            }
        });
    }
    public function BeforeChildren( $node ) {
        $node->parent = $this;
        if ( !$this->IsChildren() ) { $this->children = $node; return; }
        for($c = $this->children; $c->prev; $c=$c->prev);
        $c->prev = $node; $node->next = $c;
    }
    
    abstract function Parse($heap, $params, $selectParent);
}
abstract class ViewNode {
    private $node;
    public $attributes;
    public function __construct( Node $node , $attributes = [] ) {
        $this->node = $node;
        $this->attributes = $attributes;
    }
    public function DoView( $attributes = [] ) {
        $this->attributes = $attributes + $this->attributes;
        $buf = '';
        if ( $this->node->params ) { $buf .= $this->View( $this->node->params ); }
        if ( $this->node->IsChildren() ) { $buf .= $this->ViewChildren(); }
        return $buf;
    }
    public function DoViewChildren( $attributes = [] ) {
        $attributes += $this->attributes;
        $buf='';
        $this->node->EachChildren(function($node) use(&$buf, $attributes) {
            $buf .= (new $this($node, $attributes))->DoView();
        });
        return $buf;
    }
    
    abstract public function View( $params );
    abstract public function ViewChildren();
}
 
class NodeExample extends Node {
    public function Parse($heap, $params = null, $selectParent = 'no') {
        $this->params = $params;
        foreach($heap as $nodeRaw) {
            if ( $nodeRaw['category'] === $selectParent ) {
                $this->AppendChildren( (new $this)->Parse($heap, $nodeRaw, $nodeRaw['url']) );
            }
        }
        return $this;
    }
}
class ViewNodeExample extends ViewNode {
    public function View( $params ) {
        return "{$this->MakeTab()}<li>{$params['id']} - {$params['url']}</li>\r\n";
    }
    public function ViewChildren() {
        return
            "{$this->MakeTab()}<ul>\r\n" .
                $this->DoViewChildren( ['deep'=> $this->attributes['deep']+1] ) .
            "{$this->MakeTab()}</ul>\r\n";
    }
    private function MakeTab() {
        return str_repeat("\x09",$this->attributes['deep']);
    }
}
 
$data = [
    ['id' => 0, 'url' => 'rrr',    'category' => 'no'],
    ['id' => 1, 'url' => 'test',   'category' => 'no'],
    ['id' => 2, 'url' => 'blabla', 'category' => 'test'],
    ['id' => 3, 'url' => 'mr',     'category' => 'test'],
    ['id' => 4, 'url' => 'ml',     'category' => 'blabla']
];
 
$node = (new NodeExample)->Parse( $data );
 
echo (new ViewNodeExample($node))->DoView(['deep' => 0]);
1
virusnyak333
20 / 20 / 0
Регистрация: 09.11.2014
Сообщений: 70
05.07.2016, 10:56  [ТС] 5
Всем спасибо за ответы - я чуть по другому решил. Может не так элегантно но работает
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$bd = bd("SELECT * FROM page WHERE category = 'no'");
        echo "<ul>";
        while($row = $bd->fetch())
        {
        echo "<li>".$row->name."</li>"; 
        page($row->url);
        }
        echo "</ul>";
        
function page($category)
{
    $bd = bd("SELECT * FROM page WHERE category = '$category'");
    while($row = $bd->fetch())
    {   
    echo "<ul><li>".$row->name."</li>"; 
    page($row->url);    
    echo "</ul>";
    }
}
0
05.07.2016, 10:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2016, 10:56

Как вывести в .DOC файл таблицу средствами PHP B HTML
Как вывести в .DOC файл таблицу средствами PHP и HTML. В браузере я её...

Как занести переменные ip и время посещения в бд, и вывести их на другой страницу в виде таблицы
У меня есть переменная doublecode в виде двоичного кода, которая генерируется...

Как вывести в таблицу определенное кол-во строк из БД для печати? Не пагинация!
Доброго времени суток. Вопрос в следующем. Из БД идет запрос на выборку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru