Форум программистов, компьютерный форум, киберфорум
Наши страницы

PHP для начинающих

Войти
Регистрация
Восстановить пароль
 
virusnyak333
20 / 20 / 0
Регистрация: 09.11.2014
Сообщений: 69
#1

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

04.07.2016, 17:31. Просмотров 183. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как вывести таблицу в виде иерархии? (PHP):

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

Вывести таблицу из CSV файла в виде HTML таблицы - PHP
Всем привет. Помогите разобраться пожалуйста. Надо вывести таблицу из CSV файла в виде HTML таблицы. CSV файл, где колонки разделены “;”....

Как вывести в нужном виде? - PHP
Всем привет. Есть такой код: &lt;?php $aa = array(0.322, 0.277, 0.110, 0.060, 0.741); // продукт1 $bb = array(0.609, 0.425, 0.61,...

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

Как правильно вывести на странице запрос в виде таблице из двух колонок - PHP
Как правильно вывести на странице запрос в виде таблице из двух колонок.Получилось вывести только одну колонку,но хочется что бы было в...

Как вывести в .DOC файл таблицу средствами PHP B HTML - PHP
Как вывести в .DOC файл таблицу средствами PHP и HTML. В браузере я её просматриваю, а как сохранить её в формате .DOC я не знаю. И...

4
полудух
154 / 138 / 29
Регистрация: 15.03.2016
Сообщений: 782
04.07.2016, 18:56 #2
рекурсивной ф-ей со вставкой <ul><li></li></ul>
0
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 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
677 / 551 / 296
Регистрация: 12.02.2016
Сообщений: 1,440
Записей в блоге: 1
04.07.2016, 20:43 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
Сообщений: 69
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
Привет! Вот еще темы с ответами:

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

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

Как в многомерном массиве найти значение ключа выше по иерархии ? - PHP
Например есть многомерный массив Array ( =&gt; Array( =&gt; а =&gt; б =&gt; в) =&gt; Array( =&gt; г =&gt; д =&gt; е) ) Зная...

Вывести значение из БД MySQL в виде картинки - PHP
Здравствуйте. Буду признателен за код, который выводит на сайт в виде картинки значение из одной из таблиц БД MySQL. Нужное...


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

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

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