Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP
Войти
Регистрация
Восстановить пароль
 
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 343
#1

Вывод дерева - PHP

12.06.2018, 19:04. Просмотров 208. Ответов 11
Метки нет (Все метки)

Привет!
Что я делаю не так?
PHP
1
2
3
4
5
6
7
8
9
10
11
    $sqlregions = DB::query("SELECT * FROM `new_regions`");
    //$addwhit = DB::query("INSERT INTO `new_regions`(`parent_id`, `region_id`, `type_id`, `name`) VALUES ('$ParentId', '$GeoRegionId', '$type_id', '$GeoRegionName')");
    while ($region = DB::fetch_object($sqlregions)) {
        $parent_id = $region->parent_id;
        $region_id = $region->region_id;
        $type_id = $region->type_id;
        $name = $region->name;
        $regions[$parent_id]['type'][] = $type_id;
        $regions[$parent_id]['region_id'][] = $region_id;
        $regions[$parent_id]['name'][] = $name;
    }
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    function build_tree($regions,$parent_id,$lvl){
        if (count($regions[$parent_id]['region_id']) > 0 ) {
            $lvl++;
        }
        for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            $name = $regions[$parent_id]['name'][$i];
            $type_id = $regions[$parent_id]['type_id'][$i];
            $region_id = $regions[$parent_id]['region_id'][$i];
            echo "$lvl $region_id $name<br>";
            build_tree($regions, $region_id, $lvl);
        }
    }
 
    //$lvl = 0;
    build_tree($regions, 0, 0);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2018, 19:04
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вывод дерева (PHP):

Вывод дерева с поиском
Никак не могу допереть до нормального решения, есть дерево в mysql все дерево...

Создание дерева из массива
Здравствуйте, уважаемые коллеги! Помогите, пожалуйста, решить задачу....

Заполнение бинарного дерева по уровням (в ширину)
Добрый день, необходимо реализовать на php заполнение бинарного дерева в ширину...

вывод дерева
как можно организовать вывод древовидных комментариев. есть массив: =&gt;...

вывод дерева
есть таблица id|parentId|name 1|0|главная 2|0|новости 3|2|новость1...

Вывод дерева для админ панели
Всех приветствую! Имеется база данных со скиллами студентов, которую надо...

11
Mr_Nerub
23 / 23 / 15
Регистрация: 05.06.2018
Сообщений: 83
12.06.2018, 21:21 #2
vino0s, во-первых, было бы неплохо узнать, что у вас за проблема. Во-вторых, вот так навскидку я увидел лишь 1 недочет:
PHP
1
2
3
$regions[$parent_id]['type'][] = $type_id;
//и
$regions[$parent_id]['type_id'][$i];
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 343
13.06.2018, 11:34  [ТС] #3
Ну надо дерево вывести, но не получается.
Структура думаю видна и ясна.

ага это я исправил, но это ни как не помогает.

Добавлено через 16 минут
Записей в БД всего 814
А выводит мне:

0 0 Все
--------
31388 0 Все

0 - это корневой, его name = Все
Как то так... Он мне выводит только корневую запись, и выводит ее 31388 раз вместо 814.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    function build_tree($regions,$parent_id,$lvl){
        if (count($regions[$parent_id]['region_id']) > 1 ) {
            for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
                $name = $regions[$parent_id]['name'][$i];
                $type_id = $regions[$parent_id]['type_id'][$i];
                $region_id = $regions[$parent_id]['region_id'][$i];
                echo "$lvl $region_id $name<br>";
                $lvl++;
                build_tree($regions, $region_id, $lvl);
            }
        }
        
        /*for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            $name = $regions[$parent_id]['name'][$i];
            $type_id = $regions[$parent_id]['type_id'][$i];
            $region_id = $regions[$parent_id]['region_id'][$i];
            echo "$lvl $region_id $name<br>";
            if (count($regions[$region_id]['region_id']) > 1 ) {
                $lvl++;
                build_tree($regions, $region_id, $lvl);
            }
        }*/
    }
0
Mr_Nerub
23 / 23 / 15
Регистрация: 05.06.2018
Сообщений: 83
13.06.2018, 12:02 #4
vino0s, у вас цикл довольно странный. Смотрите, как у вас выходит:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function build_tree($regions,$parent_id,$lvl){
      if (count($regions[$parent_id]['region_id']) > 1 ) {
            for ($i=0; $i < count($regions[$parent_id]['name']); $i++) {
 
                //берется $i = 0;
 
                $name = $regions[$parent_id]['name'][$i];  
// ['name'][0]
                $type_id = $regions[$parent_id]['type_id'][$i];  
// ['type_id'][0]
                $region_id = $regions[$parent_id]['region_id'][$i]; 
 // ['region_id'][0]
                echo "$lvl $region_id $name<br>"; 
                $lvl++; 
// к $lvl добавляется 1
                build_tree($regions, $region_id, $lvl); 
//а здесь вы вызываете вновь эту же функцию, которая вновь будет работать лишь с одним $i = 0
            }
        }
Вы снова и снова вызываете функцию, где меняется лишь $lvl. Именно потому в echo $region_id и $name не меняются, потому как вы снова и снова вызываете функцию внутри функции, цикл которой успевает поработать лишь с $i = 0. Если например строку build_tree($regions, $region_id, $lvl); поставить первой же в цикле, то он вообще ничего не будет выводить, потому что функция вызывается, объявляется цикл, и в цикле первой же строкой идет вызов функции, в которой объявляется цикл, в которой первой же строкой идет вызов функции, и т.д. Суть вы, надеюсь, уловили.
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 343
13.06.2018, 12:53  [ТС] #5
Ну вот так вот должна была работать, по крайней мере в голове)) Но все равно только нулевой выводит, видимо я не понимаю как работает рекурсия.
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
function build_tree($regions,$parent_id,$lvl){
        
        for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            $name = $regions[$parent_id]['name'][$i];
            $type_id = $regions[$parent_id]['type_id'][$i];
            $region_id = $regions[$parent_id]['region_id'][$i];
            echo "$lvl $region_id $name<br>";
            if (count($regions[$parent_id]['region_id']) > 1 ) {
                $lvl++;
                build_tree($regions, $region_id, $lvl);
            }
        }
        
        /*for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            $name = $regions[$parent_id]['name'][$i];
            $type_id = $regions[$parent_id]['type_id'][$i];
            $region_id = $regions[$parent_id]['region_id'][$i];
            echo "$lvl $region_id $name<br>";
            if (count($regions[$region_id]['region_id']) > 1 ) {
                $lvl++;
                build_tree($regions, $region_id, $lvl);
            }
        }*/
    }
Добавлено через 1 минуту
Цитата Сообщение от Mr_Nerub Посмотреть сообщение
Вы снова и снова вызываете функцию, где меняется лишь $lvl.
Тут по структуре есть region_id и parent_id, вызываю я внутри цикла для region_id, если он имеет внутри себя массив (если он является parent_id для других)

Добавлено через 6 минут
Цитата Сообщение от Mr_Nerub Посмотреть сообщение
Суть вы, надеюсь, уловили.
Да я понял... Думал рекурсия запоминает предыдущие циклы))

А как быть то тогда?

Добавлено через 7 минут
Думаю надо как то второй массив создать в котором счетчик регулировать, и в функцию передавать...
И не выводить наверно те что уже выводили...
0
Mr_Nerub
23 / 23 / 15
Регистрация: 05.06.2018
Сообщений: 83
13.06.2018, 12:57 #6
Цитата Сообщение от vino0s Посмотреть сообщение
Тут по структуре есть region_id и parent_id, вызываю я внутри цикла для region_id, если он имеет внутри себя массив (если он является parent_id для других)
Неправильно. Смотрите:
PHP
1
2
3
4
5
6
$region_id = $regions[$parent_id]['region_id'][$i]; //здесь вы получаете значение
 
      if (count($regions[$parent_id]['region_id']) > 1 ) { //здесь вы узнаете является ли значение массивом
              $lvl++;
              build_tree($regions, $region_id, $lvl); //если массив, то вызываем эту же функцию
      }
Если массив, то вызываем эту же функцию. Вот только факт первый: остальные элементы цикла прекращаются. Например, если при $i = 2, например, элемент будет массивом, то все остальные элементы цикла игнорируются, потому что вызывается функция.
И факт второй:
PHP
1
2
if (count($regions[$parent_id]['region_id']) > 1 )
      build_tree($regions, $region_id, $lvl);
PHP
1
2
function build_tree($regions,$parent_id,$lvl){
        for ($i=0; $i < count($regions[$parent_id]['name']); $i++) {
Когда вы вызываете функцию, которая внутри функции, вы передаете в массив переменную $region_id и она же для этой функции становится $parent_id. Посмотрите на второй параметр функции внутри цикла и на второй же параметр самой функции. И когда эта функция вызывается у вас вместо $regions[$parent_id][$region_id] всё работает, как если бы вы вызвали $regions[$parent_id].
Допустим, $region_id = 223, $lvl = 3, а $regions - массив.
Тогда при вызове build_tree($regions, 223, 3); функция будет выглядеть так:
PHP
1
2
function build_tree($regions, 223, 3){
        for ($i=0; $i < count($regions[223]['name']); $i++) {
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 343
13.06.2018, 13:06  [ТС] #7
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
function build_tree($regions, $printed, $parent_id, $i, $lvl){
        $printed[$parent_id] = $i;
        $name = $regions[$parent_id]['name'][$i];
        $type_id = $regions[$parent_id]['type_id'][$i];
        $region_id = $regions[$parent_id]['region_id'][$i];
        echo "$lvl $region_id $name<br>";
        $printed[] = $parent_id;
        if (count($regions[$region_id]['region_id']) > 1 ) {
            $lvl++;
            build_tree($regions, $printed, $region_id, $i, $lvl);
        } else {
            $i++;
            if ($i == count($regions[$region_id]['region_id']) ) {
                $lvl--;
            }
        }
 
        
        /*for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            if (!in_array($parent_id, $printed)) {
                $name = $regions[$parent_id]['name'][$i];
                $type_id = $regions[$parent_id]['type_id'][$i];
                $region_id = $regions[$parent_id]['region_id'][$i];
                echo "$lvl $region_id $name<br>";
                $printed[] = $parent_id;
                if (count($regions[$region_id]['region_id']) > 1 ) {
                    $lvl++;
                    build_tree($regions, $region_id, $lvl);
                }
            }
        }*/
        
        /*for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            $name = $regions[$parent_id]['name'][$i];
            $type_id = $regions[$parent_id]['type_id'][$i];
            $region_id = $regions[$parent_id]['region_id'][$i];
            echo "$lvl $region_id $name<br>";
            if (count($regions[$region_id]['region_id']) > 1 ) {
                $lvl++;
                build_tree($regions, $region_id, $lvl);
            }
        }*/
    }
 
    //$lvl = 0;
    $printed = array();
    build_tree($regions, $printed, 0, 0, 0);
Как то примерно так...

Добавлено через 3 минуты
Вот сейчас сократилось количество строк до 2308

Добавлено через 37 секунд
Но всё равно всегда выводит "0 Все"

Добавлено через 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
function build_tree($regions, $printed, $parent_id, $i, $lvl){
        $printed[$lvl]['parent'] = $parent_id;
        $printed[$lvl]['i'] = $i;
        $name = $regions[$parent_id]['name'][$i];
        $type_id = $regions[$parent_id]['type_id'][$i];
        $region_id = $regions[$parent_id]['region_id'][$i];
        echo "$lvl $region_id $name<br>";
 
        if (count($regions[$region_id]['region_id']) > 1 ) {
            $lvl++;
            build_tree($regions, $printed, $region_id, 0, $lvl);
        } else {
            $i++;
            if ($i == count($regions[$region_id]['region_id']) ) {
                $lvl--;
                $i = $printed[$lvl]['i'];
                $parent_id = $printed[$lvl]['parent'];
                build_tree($regions, $printed, $region_id, $i, $lvl);
            }
        }
 
        
        /*for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            if (!in_array($parent_id, $printed)) {
                $name = $regions[$parent_id]['name'][$i];
                $type_id = $regions[$parent_id]['type_id'][$i];
                $region_id = $regions[$parent_id]['region_id'][$i];
                echo "$lvl $region_id $name<br>";
                $printed[] = $parent_id;
                if (count($regions[$region_id]['region_id']) > 1 ) {
                    $lvl++;
                    build_tree($regions, $region_id, $lvl);
                }
            }
        }*/
        
        /*for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            $name = $regions[$parent_id]['name'][$i];
            $type_id = $regions[$parent_id]['type_id'][$i];
            $region_id = $regions[$parent_id]['region_id'][$i];
            echo "$lvl $region_id $name<br>";
            if (count($regions[$region_id]['region_id']) > 1 ) {
                $lvl++;
                build_tree($regions, $region_id, $lvl);
            }
        }*/
    }
Как то так...
0
Mr_Nerub
23 / 23 / 15
Регистрация: 05.06.2018
Сообщений: 83
13.06.2018, 13:37 #8
Что-то я сегодня туплю...
vino0s, у меня 2 вопроса:
1) Как выглядят данные, получаемые из БД? $region_id является массивом или он при переборе массива должен подставляться в $parent_id и искать таким образом уже свои $region_id?

2) Тут я пропустил этот момент, но разве здесь нужен такой массив $regions[$parent_id]['type'][]?
PHP
1
2
3
4
5
6
while ($region = DB::fetch_object($sqlregions)) {
        ...
        $regions[$parent_id]['type'][] = $type_id;
        $regions[$parent_id]['region_id'][] = $region_id;
        $regions[$parent_id]['name'][] = $name;
}
Чтобы вы понимали, начиная с 0, в $regions поступают следующие данные:
PHP
1
2
3
[0]['type'][] = $type_id;
[1]['type'][] = $type_id;
[2]['type'][] = $type_id;
То есть никаких [$parent_id]['type'][1], [$parent_id]['type'][2], [$parent_id]['type'][3] не будет, потому что [$parent_id]['type' имеет в себе лишь один индекс - [0].
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 343
13.06.2018, 14:13  [ТС] #9
Цитата Сообщение от Mr_Nerub Посмотреть сообщение
То есть никаких [$parent_id]['type'][1]
Почему? Я всегда так делал, сейчас ещё раз гляну print_r

Добавлено через 2 минуты
Вот часть массива

HTML5
1
Array ( [0] => Array ( [type_id] => Array ( [0] => 1 [1] => 5 [2] => 5 [3] => 6 [4] => 5 [5] => 4 [6] => 5 [7] => 2 [8] => 5 [9] => 5 ) [region_id] => Array ( [0] => 0 [1] => 111 [2] => 138 [3] => 166 [4] => 183 [5] => 225 [6] => 241 [7] => 977 [8] => 10002 [9] => 10003 ) [name] => Array ( [0] => Все [1] => Европа [2] => Австралия и Океания [3] => СНГ (исключая Россию) [4] => Азия [5] => Россия [6] => Африка [7] => Республика Крым [8] => Северная Америка [9] => Южная Америка ) ) [3] => Array ( [type_id] => Array ( [0] => 2 [1] => 2 [2] => 2 [3] => 2 [4] => 2 [5] => 2 [6] => 2 [7] => 2 [8] => 2 [9] => 2 [10] => 2 [11] => 2 [12] => 2 [13] => 2 [14] => 2 [15] => 2 [16] => 2 ) [region_id] => Array ( [0] => 1 [1] => 10645 [2] => 10650 [3] => 10658 [4] => 10672 [5] => 10687 [6] => 10693 [7] => 10699 [8] => 10705 [9] => 10712 [10] => 10772 [11] => 10776 [12] => 10795 [13] => 10802 [14] => 10819 [15] => 10832 [16] => 10841 ) [name] => Array ( [0] => Москва и область [1] => Белгородская область [2] => Брянская область [3] => Владимирская область [4] => Воронежская область [5] => Ивановская область [6] => Калужская область [7] => Костромская область [8] => Курская область [9] => Липецкая область [10] => Орловская область [11] => Рязанская область [12] => Смоленская область [13] => Тамбовская область [14] => Тверская область [15] => Тульская область [16] => Ярославская область ) ) [10174] => Array ( [type_id] => Array ( [0] => 3 [1] => 3 [2] => 9 [3] => 9 [4] => 9 [5] => 9 [6] => 9 [7] => 9 [8] => 9 [9] => 9 [10] => 9 [11] => 9 [12] => 9 [13] => 9 [14] => 9 ) [region_id] => Array ( [0] => 2 [1] => 10891 [2] => 98620 [3] => 98621 [4] => 98622 [5] => 98623 [6] => 98624 [7] => 98625 [8] => 98626 [9] => 98629 [10] => 98630 [11] => 98631 [12] => 98632 [13] => 98633 [14] => 98634 ) [name] => Array ( [0] => Санкт-Петербург [1] => Сосновый Бор [2] => Волховский район [3] => Всеволожский район [4] => Выборгский район [5] => Гатчинский район [6] => Кингисеппский район [7] => Киришский район [8] => Кировский район [9] => Лужский район [10] => Подпорожский район [11] => Приозерский район [12] => Сланцевский район [13] => Тихвинский район [14] => Тосненский район ) ) [225] => Array ( [type_id] => Array ( [0] => 2 [1] => 2 [2] => 2 [3] => 2 [4] => 2 [5] => 2 [6] => 2 [7] => 2 ) [region_id] => Array ( [0] => 3 [1] => 17 [2] => 26 [3] => 40 [4] => 52 [5] => 59 [6] => 73 [7] => 102444 ) [name] => Array ( [0] => Центр [1] => Северо-Запад [2] => Юг [3] => Поволжье [4] => Урал [5] => Сибирь [6] => Дальний Восток [7] => Северный Кавказ ) )
Добавлено через 17 секунд
JSON
1
Array ( [0] => Array ( [type_id] => Array ( [0] => 1 [1] => 5 [2] => 5 [3] => 6 [4] => 5 [5] => 4 [6] => 5 [7] => 2 [8] => 5 [9] => 5 ) [region_id] => Array ( [0] => 0 [1] => 111 [2] => 138 [3] => 166 [4] => 183 [5] => 225 [6] => 241 [7] => 977 [8] => 10002 [9] => 10003 ) [name] => Array ( [0] => Все [1] => Европа [2] => Австралия и Океания [3] => СНГ (исключая Россию) [4] => Азия [5] => Россия [6] => Африка [7] => Республика Крым [8] => Северная Америка [9] => Южная Америка ) ) [3] => Array ( [type_id] => Array ( [0] => 2 [1] => 2 [2] => 2 [3] => 2 [4] => 2 [5] => 2 [6] => 2 [7] => 2 [8] => 2 [9] => 2 [10] => 2 [11] => 2 [12] => 2 [13] => 2 [14] => 2 [15] => 2 [16] => 2 ) [region_id] => Array ( [0] => 1 [1] => 10645 [2] => 10650 [3] => 10658 [4] => 10672 [5] => 10687 [6] => 10693 [7] => 10699 [8] => 10705 [9] => 10712 [10] => 10772 [11] => 10776 [12] => 10795 [13] => 10802 [14] => 10819 [15] => 10832 [16] => 10841 ) [name] => Array ( [0] => Москва и область [1] => Белгородская область [2] => Брянская область [3] => Владимирская область [4] => Воронежская область [5] => Ивановская область [6] => Калужская область [7] => Костромская область [8] => Курская область [9] => Липецкая область [10] => Орловская область [11] => Рязанская область [12] => Смоленская область [13] => Тамбовская область [14] => Тверская область [15] => Тульская область [16] => Ярославская область ) ) [10174] => Array ( [type_id] => Array ( [0] => 3 [1] => 3 [2] => 9 [3] => 9 [4] => 9 [5] => 9 [6] => 9 [7] => 9 [8] => 9 [9] => 9 [10] => 9 [11] => 9 [12] => 9 [13] => 9 [14] => 9 ) [region_id] => Array ( [0] => 2 [1] => 10891 [2] => 98620 [3] => 98621 [4] => 98622 [5] => 98623 [6] => 98624 [7] => 98625 [8] => 98626 [9] => 98629 [10] => 98630 [11] => 98631 [12] => 98632 [13] => 98633 [14] => 98634 ) [name] => Array ( [0] => Санкт-Петербург [1] => Сосновый Бор [2] => Волховский район [3] => Всеволожский район [4] => Выборгский район [5] => Гатчинский район [6] => Кингисеппский район [7] => Киришский район [8] => Кировский район [9] => Лужский район [10] => Подпорожский район [11] => Приозерский район [12] => Сланцевский район [13] => Тихвинский район [14] => Тосненский район ) ) [225] => Array ( [type_id] => Array ( [0] => 2 [1] => 2 [2] => 2 [3] => 2 [4] => 2 [5] => 2 [6] => 2 [7] => 2 ) [region_id] => Array ( [0] => 3 [1] => 17 [2] => 26 [3] => 40 [4] => 52 [5] => 59 [6] => 73 [7] => 102444 ) [name] => Array ( [0] => Центр [1] => Северо-Запад [2] => Юг [3] => Поволжье [4] => Урал [5] => Сибирь [6] => Дальний Восток [7] => Северный Кавказ ) )
Добавлено через 1 минуту
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$sqlregions = DB::query("SELECT * FROM `new_regions`");
    //$addwhit = DB::query("INSERT INTO `new_regions`(`parent_id`, `region_id`, `type_id`, `name`) VALUES ('$ParentId', '$GeoRegionId', '$type_id', '$GeoRegionName')");
    while ($region = DB::fetch_object($sqlregions)) {
        $parent_id = $region->parent_id;
        $region_id = $region->region_id;
        $type_id = $region->type_id;
        $name = $region->name;
        $regions[$parent_id]['type_id'][] = $type_id;
        $regions[$parent_id]['region_id'][] = $region_id;
        $regions[$parent_id]['name'][] = $name;
    }
    print_r($regions);
Добавлено через 2 минуты
В таблице 5 полей: id (счетчик), id_parent(родитель начинаем с 0), id_region(у 0 id_parent 0 и id_region 0 ), type_id (можно внимания не обращать), name ( то что в принципе надо вывести )

Добавлено через 4 минуты
вот часть таблицы:
1 0 0 1 Все
2 3 1 2 Москва и область
4 225 3 2 Центр
139 1 213 3 Москва
146 0 225 4 Россия

Добавлено через 3 минуты
Что мы тут видим: Что Россия имеет родителя Все, в России есть Центр т.к. у него родитель равен id_region России (225), в Центре есть Москва и область, в которой есть Москва.

Думаю тут понятно как надо чтобы вывелось))

Добавлено через 4 минуты
Цитата Сообщение от Mr_Nerub Посмотреть сообщение
но разве здесь нужен такой массив
Этого я не могу сказать, возможно не обязательно, я же просто пишу как представляю))

Добавлено через 34 секунды
Разбиваю массив на подмассивы по идентификатору родителя

Добавлено через 1 минуту
Цитата Сообщение от vino0s Посмотреть сообщение
у 0 id_parent 0 и id_region 0
Вот из за этой фигни он циклируется, ща че нить придумаю

Добавлено через 1 минуту
Дал первой строчке:
1 NULL 0 1 Все
теперь у корня родитель NULL, начну плясать отсюда

Добавлено через 7 минут
Пфффф.... Блееее...

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
function build_tree($regions,/* $printed, */$parent_id, /*$i, */$lvl){
        /*$printed[$lvl]['parent'] = $parent_id;
        $printed[$lvl]['i'] = $i;
        $name = $regions[$parent_id]['name'][$i];
        $type_id = $regions[$parent_id]['type_id'][$i];
        $region_id = $regions[$parent_id]['region_id'][$i];
        echo "$lvl $region_id $name<br>";
 
        if (count($regions[$region_id]['region_id']) > 1 ) {
            $lvl++;
            build_tree($regions, $printed, $region_id, 0, $lvl);
        } else {
            $i++;
            if ($i == count($regions[$region_id]['region_id']) ) {
                $lvl--;
                $i = $printed[$lvl]['i'];
                $parent_id = $printed[$lvl]['parent'];
                build_tree($regions, $printed, $region_id, $i, $lvl);
            }
        }*/
 
        
        for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            //if (!in_array($parent_id, $printed)) {
                $name = $regions[$parent_id]['name'][$i];
                $type_id = $regions[$parent_id]['type_id'][$i];
                $region_id = $regions[$parent_id]['region_id'][$i];
                echo "$lvl $region_id $name<br>";
                //$printed[] = $parent_id;
                if (count($regions[$region_id]['region_id']) > 1 ) {
                    $lvl++;
                    build_tree($regions, $region_id, $lvl);
                }
            //}
        }
        
        /*for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            $name = $regions[$parent_id]['name'][$i];
            $type_id = $regions[$parent_id]['type_id'][$i];
            $region_id = $regions[$parent_id]['region_id'][$i];
            echo "$lvl $region_id $name<br>";
            if (count($regions[$region_id]['region_id']) > 1 ) {
                $lvl++;
                build_tree($regions, $region_id, $lvl);
            }
        }*/
    }
 
    //$lvl = 0;
    //$printed = array();
    //build_tree($regions, $printed, 0, 0, 0);
    build_tree($regions, 0, 0);
Чуть чуть уровни лагают, понижение где то видимо надо сделать или повышение где то частит...

Вот примерный вывод из середины:


4 225 Россия
5 3 Центр
6 1 Москва и область
7 213 Москва
8 216 Зеленоград
8 20674 Троицк
8 21624 Щербинка
8 214 Долгопрудный
8 215 Дубна
8 217 Пущино
8 219 Черноголовка
8 10716 Балашиха
8 10717 Бронницы
8 10725 Домодедово
8 10729 Звенигород
8 10734 Коломна
8 10745 Орехово-Зуево
8 10747 Подольск
8 10754 Серпухов
8 10758 Химки
8 20523 Электросталь
8 20571 Жуковский
8 20576 Протвино
8 20728 Королёв
8 21619 Фрязино
8 21621 Реутов
8 21623 Ивантеевка
8 21630 Лыткарино
8 21635 Лосино-Петровский
8 21641 Лобня
8 21647 Краснознаменск
8 21735 Дзержинский
8 98580 Волоколамский район
8 98581 Воскресенский район
8 98582 Дмитровский район
8 98584 Егорьевск (городской округ)
8 98585 Зарайск (городской округ)
8 98586 Истринский район
9 10731 Истра
9 21627 Дедовск
9 98587 Кашира (городской округ)
9 98588 Клинский район
9 98590 Красногорск (городской округ)
10 10735 Красногорск
10 21745 Нахабино
10 98591 Ленинский район
10 98593 Луховицы (городской округ)
10 98594 Люберцы (городской округ)
10 98595 Можайский район
10 98596 Мытищи (городской округ)
10 98597 Наро-Фоминский район
11 10715 Апрелевка
11 10741 Наро-Фоминск
11 98598 Ногинский район
12 10742 Ногинск
12 21642 Электроугли
12 21656 Старая Купавна
12 98599 Одинцовский район
13 10743 Одинцово
13 21625 Кубинка
13 21646 Голицыно
13 98602 Павловский Посад (городской округ)
13 98604 Пушкинский район
13 98605 Раменский район
13 98606 Рузский городской округ
13 98607 Ступинский район
13 98608 Сергиево-Посадский район
14 10752 Сергиев Посад
14 21645 Хотьково
14 98611 Солнечногорский район
14 98614 Чеховский район
14 98615 Шатурский район
14 98617 Щёлковский район
14 100471 Красноармейск
7 10645 Белгородская область
8 4 Белгород
8 10646 Губкин
8 10649 Старый Оскол
8 98697 Алексеевский район
8 98716 Шебекинский район
8 98717 Яковлевский район
8 10650 Брянская область
9 191 Брянск
9 10653 Клинцы
9 10658 Владимирская область
10 192 Владимир
10 10661 Гусь-Хрустальный
10 10664 Ковров
10 10668 Муром


Добавлено через 1 минуту
Грубо говоря у России должен был быть уровень 1, если уровень все 0.
0
Mr_Nerub
23 / 23 / 15
Регистрация: 05.06.2018
Сообщений: 83
13.06.2018, 14:16 #10
Цитата Сообщение от vino0s Посмотреть сообщение
Почему?
Извиняюсь, моя оплошка - думал, что $parent_id является ключом.

Цитата Сообщение от vino0s Посмотреть сообщение
Вот из за этой фигни он циклируется, ща че нить придумаю
Тоже хотел обратить на это внимание. Если бы пример данных не скинули бы, то я бы даже не знал, что он постоянно на это ссылается. Хотя выводимые данные как бы объясняют, да.
1
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 343
13.06.2018, 14:24  [ТС] #11
Благодарю что спросили! )) Так бы и я не нашел, так и бы думал что проблема в коде) А не во входных данных)))
Теперь только с lvl какой то косяк)) Но это уже проще)

Мне вообще надо checkbox ы сделать, чтобы если на "Все" нажал то все выделились, если на "Россия" то все что есть в "России". Есть какой то инструмент? А то чувствую я дальше начну новый велик изобретать на jQuery... (А если они ещё и сворачиваться будут, было бы вообще шикарно)))
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 343
15.06.2018, 08:27  [ТС] #12
Так что то и не получается понизить lvl, видимо во время рекурсии возвращается старый уровень lvl и затем снова его повышает...
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function build_tree($regions, $parent_id, $lvl){
        for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            $name = $regions[$parent_id]['name'][$i];
            $type_id = $regions[$parent_id]['type_id'][$i];
            $region_id = $regions[$parent_id]['region_id'][$i];
            $cou = count($regions[$parent_id]['region_id'])-1;
            echo '<input class="checkbox__control" type="checkbox" autocomplete="off" id="region-'.$region_id.'" aria-labelledby="labelregion-'.$region_id.'">';
            echo '<label class="checkbox__label" aria-hidden="true" id="labelregion-'.$region_id.'" for="region-'.$region_id.'">'.$name.' '.$lvl.' '.$i.' '.$cou.'</label><br>';
            if ($i == count($regions[$parent_id]['region_id'])-1 ) {
                $lvl--;
                echo "$lvl";
            }
            if (count($regions[$region_id]['region_id']) > 0 ) {
                $lvl++;
                $margin = 20*$lvl;
                echo "<div class=\"tree\">вЉ•</div>";
                echo "<div class=\"parentregion-$region_id hidden\" style=\"margin-left:$margin\">";
                build_tree($regions, $region_id, $lvl);
                echo "</div>";
            }
        }
    }
Добавлено через 2 минуты
Стили, если кому надо будет.
CSS
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
.checkbox__control {
    display: inline-block;
}
 
.checkbox__label {
    display: inline-block;
    margin-left: 10px;
}
 
.treehead {
    margin-left: 20px;
    font-size: 2em;
    position: relative;
}
 
.tree {
    display: inline-block;
    position: absolute;
    margin-left: -17px;
    margin-top: -17px;
    cursor: pointer;
}
 
.hidden {
    display: none;
}
И скрипты
Javascript
1
2
3
4
5
6
$(document).on("click", ".checkbox__control", function(e){
                        if (e.which == 1) { if (this.checked) {console.log($(this).attr("id")); } }
                    });
                    $(document).on("click", ".tree", function(e){
                        if (e.which == 1) { if ($(this).next().hasClass("hidden")) {$(this).next().removeClass("hidden");} else {$(this).next().addClass("hidden");} }
                    });
Добавлено через 5 минут
Блин, оказывается так тупо, после строчки с рекурсией добавил декремент...
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function build_tree($regions, $parent_id, $lvl){
        for ($i=0; $i < count($regions[$parent_id]['name']); $i++) { 
            $name = $regions[$parent_id]['name'][$i];
            $type_id = $regions[$parent_id]['type_id'][$i];
            $region_id = $regions[$parent_id]['region_id'][$i];
            $cou = count($regions[$parent_id]['region_id'])-1;
            echo '<input class="checkbox__control" type="checkbox" autocomplete="off" id="region-'.$region_id.'" aria-labelledby="labelregion-'.$region_id.'">';
            echo '<label class="checkbox__label" aria-hidden="true" id="labelregion-'.$region_id.'" for="region-'.$region_id.'">'.$name.' '.$lvl.' '.$i.' '.$cou.'</label><br>';
            if ($i == count($regions[$parent_id]['region_id'])-1 ) {
                $lvl--;
                //echo "$lvl";
            }
            if (count($regions[$region_id]['region_id']) > 0 ) {
                $lvl++;
                $margin = 20*$lvl;
                echo "<div class=\"tree\">вЉ•</div>";
                echo "<div class=\"parentregion-$region_id hidden\" style=\"margin-left:$margin\">";
                build_tree($regions, $region_id, $lvl);
                echo "</div>";
                $lvl--;
            }
        }
    }
0
15.06.2018, 08:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2018, 08:27
Привет! Вот еще темы с решениями:

Вывод из Excel многоуровневого списка в виде дерева
Здравствуйте! (я полный ноль) Каким образом можно реализовать вывод...

Вывод данных из базы данных MySQL в PHP в виде дерева.
У нас в сети решили сделать портал-базу по рефератам. Все я сделал остались две...

Перебор дерева
Коллеги доброго времени суток. Прошу помощи, т.к. не справляюсь: итак, есть...

Вывод бинарного дерева в виде дерева
Помогите пожалуйста вывести дерево в консоль в виде дерева. Саму структуру я...


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

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

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