ФорумРазработкаБазы данных → Построение дерева, единственный выход?

Построение дерева, единственный выход?

  • artoodetoo

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

    Spritz 29 июня 2015 г. 19:15, спустя 1 час 20 минут 27 секунд

    @developer, кроме шуток, если ты почему-то не хочешь вытянуть всё дерево одним запросом, то можешь вытягивать за n запросов, где n - уровень вложенности. это если использовать

    … WHERE parent_id IN(список предыдущего уровня)
    

    а логику на php возьми из ссылки абырвалга

    ιιlllιlllι унц-унц
  • master

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

    Spritz 29 июня 2015 г. 20:47, спустя 1 час 32 минуты 36 секунд

    
    $list = (select id,parent_id,name from categories)
    
    $roots = array();
    for ($list as &$li){
      if ($li['parent_id']){
        $parent = $list[$li['parent_id']];
        $parent['_children'][] = &$li;
      } else {
        $roots[] = &$li;
      }
    }
    

    получишь дерево

    Спустя 118 сек.

    ну, примерно так. один запрос, сложность O(n)

    не всё полезно, что в swap полезло
  • developer

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

    Spritz 30 июня 2015 г. 10:43, спустя 13 часов 55 минут 39 секунд

    я так и делаю, но мне нужно вытащить не весь список, а только отдельные категории которые относятся для данной модели авто, а запрос вытаскивает все подряд

  • developer

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

    Spritz 30 июня 2015 г. 16:50, спустя 6 часов 6 минут 54 секунды

    Сделал так:

            while($arPRes = tep_db_fetch_array($SQL)){ 
                if(empty($arPRes['STR_ID_PARENT'])) {
                    $menu[] = $arPRes;
                    $menu[sizeof($menu)-1]['child'] = array();
                    $menu_index[$arPRes['STR_ID']] = &$menu[sizeof($menu)-1];
                } else {
                    $menu_index[$arPRes['STR_ID_PARENT']]['child'][] = $arPRes;
                    $menu_index[$arPRes['STR_ID']] = &$menu_index[$arPRes['STR_ID_PARENT']]['child'][sizeof($menu_index[$arPRes['STR_ID_PARENT']]['child'])-1];
                }
    
            }
    
        foreach($menu as $key => $value) {
            if($value['STR_ID'] == 10001) {         
                echo GetCat($value);
            }
        }

    вроде как мои категории уже вышли в дереве, причем читабельном, дал функцию:

        function GetCat($array){
            $result .= '<ul>';       
            foreach($array as $key => $value) {
                $result .= '<li>' . $value['STR_DES_TEXT'] . ', id: ' . $value['STR_ID'] . ', sub:' . $value['STR_ID_PARENT'];
                if($value['child']) {
                    $result .= GetCat($value['child']);
                }
                $result .= '</li>';
            }               
            $result .= '</ul>';
            return $result;
        }

    Но что-то пошло не так, вот пример того что даю на функцию:

    Array
    (
        [STR_ID] => 10001
        [STR_DES_TEXT] => Легковые автомобили
        [STR_ID_PARENT] => 
        [STR_LEVEL] => 1
        [STR_SORT] => 1
        [STR_NODE_NR] => 1
        [DESCENDANTS] => 1
        [child] => Array
            (
                [0] => Array
                    (
                        [STR_ID] => 10443
                        [STR_DES_TEXT] => Оборудование для перевозки
                        [STR_ID_PARENT] => 10001
                        [STR_LEVEL] => 2
                        [STR_SORT] => 927
                        [STR_NODE_NR] => 443
                        [DESCENDANTS] => 1
                    )
    
                [1] => Array
                    (
                        [STR_ID] => 10341
                        [STR_DES_TEXT] => Отопление / вентиляция
                        [STR_ID_PARENT] => 10001
                        [STR_LEVEL] => 2
                        [STR_SORT] => 890
                        [STR_NODE_NR] => 341
                        [DESCENDANTS] => 1
                        [child] => Array
                            (
                                [0] => Array
                                    (
                                        [STR_ID] => 10447
                                        [STR_DES_TEXT] => Теплообменник
                                        [STR_ID_PARENT] => 10341
                                        [STR_LEVEL] => 3
                                        [STR_SORT] => 892
                                        [STR_NODE_NR] => 447
                                        [DESCENDANTS] => 0
                                    )
    
                                [1] => Array
                                    (
                                        [STR_ID] => 10446
                                        [STR_DES_TEXT] => Фильтр салона
                                        [STR_ID_PARENT] => 10341
                                        [STR_LEVEL] => 3
                                        [STR_SORT] => 891
                                        [STR_NODE_NR] => 446
                                        [DESCENDANTS] => 0
                                    )
    
                            )
    
                    )
    
                [2] => Array
                    (
                        [STR_ID] => 10111
                        [STR_DES_TEXT] => Подвеска / амортизация
                        [STR_ID_PARENT] => 10001
                        [STR_LEVEL] => 2
                        [STR_SORT] => 695
                        [STR_NODE_NR] => 111
                        [DESCENDANTS] => 1
                        [child] => Array
                            (
                                [0] => Array
                                    (
                                        [STR_ID] => 10471
                                        [STR_DES_TEXT] => Подвеска амортизатора/стойка амортизатора
                                        [STR_ID_PARENT] => 10111
                                        [STR_LEVEL] => 3
                                        [STR_SORT] => 699
                                        [STR_NODE_NR] => 471
                                        [DESCENDANTS] => 0
                                    )
    
                                [1] => Array
                                    (
                                        [STR_ID] => 10481
                                        [STR_DES_TEXT] => Стойка амортизатора / амортизатор /-составные части
                                        [STR_ID_PARENT] => 10111
                                        [STR_LEVEL] => 3
                                        [STR_SORT] => 702
                                        [STR_NODE_NR] => 481
                                        [DESCENDANTS] => 1
                                    )
    
                                [2] => Array
                                    (
                                        [STR_ID] => 10470
                                        [STR_DES_TEXT] => Ходовая часть в сборе
                                        [STR_ID_PARENT] => 10111
                                        [STR_LEVEL] => 3
                                        [STR_SORT] => 700
                                        [STR_NODE_NR] => 470
                                        [DESCENDANTS] => 0
                                    )
    
                            )
    
                    )
    ......

    Спустя 45 сек.

    собственно после функции ерунду выводит

    Спустя 177 сек.

    все, решил, прописал

    echo GetCat($value['child']);

    Спустя 95 сек.

    но список категорий по какой-то причине не полный

  • md5

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

    Spritz 30 июня 2015 г. 20:22, спустя 3 часа 32 минуты 12 секунд

    я смотрю, всем очень интересны посты с киллометрами говнокода)

    все умрут, а я изумруд
  • phpdude

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

    Spritz 30 июня 2015 г. 20:41, спустя 19 минут 3 секунды

    я смотрю, всем очень интересны посты с киллометрами говнокода)

    @md5, не говори, от каждого поста передергиваю

    Сапожник без сапог
  • Sinkler

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

    Spritz 30 июня 2015 г. 21:31, спустя 49 минут 51 секунду

  • AlexB

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

    Spritz 30 июня 2015 г. 22:58, спустя 1 час 26 минут 47 секунд

    Господи, да расскажи-те кто-нибудь ему про Materialized Path и Nested Sets наконец ... зашибет же своим говнокодом ...

  • AlexB

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

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

    Spritz 30 июня 2015 г. 23:23, спустя 17 минут 21 секунду

    Господи, да расскажи-те кто-нибудь ему про Materialized Path и Nested Sets наконец ... зашибет же своим говнокодом ...

    @AlexB, нахуя? 80% топиков от этого чувака :)

    дальше снова тишина будет

    Сапожник без сапог
  • developer

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

    Spritz 30 июня 2015 г. 23:52, спустя 29 минут 1 секунду

    80% топиков от этого чувака :)

    дальше снова тишина будет

    я зоебал?

  • kostyl

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

    Spritz 30 июня 2015 г. 23:55, спустя 3 минуты 28 секунд

    я зоебал?

    @developer, не, наборот

  • phpdude

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

    Spritz 30 июня 2015 г. 23:59, спустя 3 минуты 54 секунды

    я зоебал?

    @developer, да нет, я сам просто не читаю, но я читаю ответы )) а мне лень и влом в страницах кода ковыряться ))

    Сапожник без сапог
  • kostyl

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

    Spritz 1 июля 2015 г. 0:06, спустя 7 минут 5 секунд

    я думаю никто код и не смотрел

  • developer

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

    Spritz 1 июля 2015 г. 0:56, спустя 49 минут 54 секунды

    третий день как обезьяна

    сделал так:

            $SQL=tep_db_query('SELECT
                    STR_ID, TEX_TEXT AS STR_DES_TEXT, STR_ID_PARENT, STR_LEVEL, STR_SORT, STR_NODE_NR, 
                    IF(EXISTS(SELECT * FROM SEARCH_TREE AS SEARCH_TREE2 WHERE SEARCH_TREE2.STR_ID_PARENT <=> SEARCH_TREE.STR_ID LIMIT 1), 1, 0) AS DESCENDANTS
                FROM SEARCH_TREE
                    INNER JOIN DESIGNATIONS ON DES_ID = STR_DES_ID
                    INNER JOIN DES_TEXTS ON TEX_ID = DES_TEX_ID
                WHERE
                    DES_LNG_ID = '.$LNG_ID.' AND
                    EXISTS (
                        SELECT * FROM LINK_GA_STR
                            INNER JOIN LINK_LA_TYP ON LAT_TYP_ID ='.$TYP_ID.' AND LAT_GA_ID = LGS_GA_ID
                            INNER JOIN LINK_ART ON LA_ID = LAT_LA_ID
                        WHERE
                            LGS_STR_ID = STR_ID
                        LIMIT 1)
                ');
                //ORDER BY STR_DES_TEXT');
    
            while($arPRes = tep_db_fetch_array($SQL)){ 
    
                if(empty($arPRes['STR_ID_PARENT'])) {
                //if($arPRes['STR_LEVEL'] == 1) {
                    $emptyArray[] = $arPRes;
                    $menu[] = $arPRes;
                    $menu[sizeof($menu)-1]['child'] = array();
                    $menu_index[$arPRes['STR_ID']] = &$menu[sizeof($menu)-1];
                } else {
                    $menu_index[$arPRes['STR_ID_PARENT']]['child'][] = $arPRes;
                    $menu_index[$arPRes['STR_ID']] = &$menu_index[$arPRes['STR_ID_PARENT']]['child'][sizeof($menu_index[$arPRes['STR_ID_PARENT']]['child'])-1];
                }
            }
    
        function sort_p($a, $b) {
            return strcmp($a["STR_DES_TEXT"], $b["STR_DES_TEXT"]);
        }
    
        function GetCat($array){
            uasort($array, "sort_p");
            $result .= '<ul>';       
            foreach($array as $key => $value) {
                $result .= '<li>' . $value['STR_DES_TEXT'] . ', id: ' . $value['STR_ID'] . ', sub:' . $value['STR_ID_PARENT'];
                if($value['child']) {
                    uasort($value['child'], "sort_p");
                    $result .= GetCat($value['child']);
                }
                $result .= '</li>';
            }               
            $result .= '</ul>';
            return $result;
        }
    
        $c10001 = $menu[0]['child'];
    
        echo '<div style="float: left; width: 50%;">' . GetCat($c10001) . '</div>';

    95% категорий как в старпосте, но в какой-то момент не все категории в $menu помещает... и соотв. выводит неменого не то:
    в категории: Детали кузова/крыло/буфер
    отсутствуют подкатегории и дальше по списку тоже пропажи есть

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