Под-категории

Тема в разделе "Как сделать...", создана пользователем StirolXXX, 25 фев 2008.

Статус темы:
Закрыта.
  1. StirolXXX

    StirolXXX Постоялец

    Регистр.:
    11 июн 2006
    Сообщения:
    80
    Симпатии:
    38
    Доброго времени суток!

    Есть таблица:

    Код:
    CREATE TABLE `categories` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `sort` int(10) NOT NULL default '0',
      `name` varchar(30) NOT NULL default '',
      `image` varchar(255) NOT NULL default '',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM;
    В ней данные такие:

    Код:
    INSERT INTO `categories` (`id`, `sort`, `name`, `image`) VALUES 
      (1, 10, 'Приложения ISO', 'appzpciso.gif'),
      (2, 20, 'Приложения PDA', 'appzpda.gif'),
      (3, 30, 'Приложения AUDIO', 'appzaudio.gif'),
      (4, 40, 'Приложения MISC', 'appzmisc.gif');
    Я хочу добавить в таблицу parent поле (т.е родительская категорий).

    Как потом из получившейся таблицы сделать уже массив с подкатегориями? Уровень вложенности нужен не ограниченный (данные в таблицу при вводе будут проветрятся насчет вечной рекурсии).

    PHP
     
  2. sw04

    sw04 seoplayer

    Регистр.:
    1 дек 2007
    Сообщения:
    601
    Симпатии:
    193
    для всех сначало устанавливаешь parent = 0, затем берешь допустим "Приложения PDA" и присваиваешь его parent = 1.
    Получишь вторую вложенность. Если надо подкатегорию для "Приложения PDA", то для записи дочернего ставишь родителем id "Приложения PDA".

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

    Другой вариант запихать всю инфу о категориях в $_SESSION.

    Если интересует код могу набросать с рекурсией...но придётся оптимизировать.
     
  3. StirolXXX

    StirolXXX Постоялец

    Регистр.:
    11 июн 2006
    Сообщения:
    80
    Симпатии:
    38
    Набросай плиз :) А я если что закину массив в кеш :)

    Добавлено через 46 минут
    Блин, получилось КАК-ТО.

    Вот как-бы теперь в один запрос?

    PHP:
    function get_tree($parent_id 0) {
        
    $out = array();
        
    $query "SELECT * FROM categories2 WHERE pid = '$parent_id' ORDER BY id, pid";
        
    $result sql_query($query);
        while (
    $row mysql_fetch_array($result)) {
            
    $subcats get_tree($row['id']);
            
    $out[] = array(
                
    'id' => $row['id'],
                
    'pid' => $row['pid'],
                
    'name' => $row['name'],
                
    'subdata' => (!empty($subcats) ? $subcats ''),
            );
        }
        return 
    $out;
    }
    CREATE TABLE `categories2` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `pid` int(10) unsigned NOT NULL default '0',
    `sort` int(10) NOT NULL default '0',
    `name` varchar(30) NOT NULL default '',
    `image` varchar(255) NOT NULL default '',
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM;
     
  4. StirolXXX

    StirolXXX Постоялец

    Регистр.:
    11 июн 2006
    Сообщения:
    80
    Симпатии:
    38
    Новая информация по теме:

    Есть скрипт, что генерирует вот такой-вот массив:

    $id => array($id, $pid, $name, $subdata)

    Пояснения ключей:
    id - номер категории
    pid - номер родительской категории
    name - название категории
    subdata - массив наподобие того что выше если у категории есть ветки, иначе просто пустое значение

    [more]
    Код:
    Array
    (
        [4] => Array
            (
                [id] => 4
                [pid] => 1
                [name] => Жанр
                [subdata] => Array
                    (
                        [10] => Array
                            (
                                [id] => 10
                                [pid] => 4
                                [name] => Драма
                                [subdata] => 
                            )
    
                        [11] => Array
                            (
                                [id] => 11
                                [pid] => 4
                                [name] => Комедия
                                [subdata] => 
                            )
    
                        [12] => Array
                            (
                                [id] => 12
                                [pid] => 4
                                [name] => Боевик
                                [subdata] => 
                            )
    
                        [13] => Array
                            (
                                [id] => 13
                                [pid] => 4
                                [name] => Фильм-катастрофа
                                [subdata] => 
                            )
    
                    )
    
            )
    
        [14] => Array
            (
                [id] => 14
                [pid] => 1
                [name] => Носитель
                [subdata] => Array
                    (
                        [15] => Array
                            (
                                [id] => 15
                                [pid] => 14
                                [name] => DVD
                                [subdata] => Array
                                    (
                                        [26] => Array
                                            (
                                                [id] => 26
                                                [pid] => 15
                                                [name] => DVD-5
                                                [subdata] => 
                                            )
    
                                        [27] => Array
                                            (
                                                [id] => 27
                                                [pid] => 15
                                                [name] => DVD-9
                                                [subdata] => 
                                            )
    
                                    )
    
                            )
    
                        [16] => Array
                            (
                                [id] => 16
                                [pid] => 14
                                [name] => BluRay
                                [subdata] => 
                            )
    
                    )
    
            )
    
        [17] => Array
            (
                [id] => 17
                [pid] => 1
                [name] => Год выпуска
                [subdata] => Array
                    (
                        [18] => Array
                            (
                                [id] => 18
                                [pid] => 17
                                [name] => < 1970
                                [subdata] => 
                            )
    
                        [19] => Array
                            (
                                [id] => 19
                                [pid] => 17
                                [name] => < 1980
                                [subdata] => 
                            )
    
                        [20] => Array
                            (
                                [id] => 20
                                [pid] => 17
                                [name] => < 1990
                                [subdata] => 
                            )
    
                        [21] => Array
                            (
                                [id] => 21
                                [pid] => 17
                                [name] => < 2000
                                [subdata] => 
                            )
    
                        [22] => Array
                            (
                                [id] => 22
                                [pid] => 17
                                [name] => < 2005
                                [subdata] => 
                            )
    
                        [23] => Array
                            (
                                [id] => 23
                                [pid] => 17
                                [name] => 2006
                                [subdata] => 
                            )
    
                        [24] => Array
                            (
                                [id] => 24
                                [pid] => 17
                                [name] => 2007
                                [subdata] => 
                            )
    
                        [25] => Array
                            (
                                [id] => 25
                                [pid] => 17
                                [name] => 2008
                                [subdata] => 
                            )
    
                    )
    
            )
    
    )
    
    [/more]

    Сам скрипт:
    [more]
    Код:
    function subcat_filter($search, $key = 'pid') {
        static $subcats;
        $filtered = array();
        if (!$subcats) {
            $res = sql_query('SELECT * FROM categories2 ORDER BY id, pid') or sqlerr(__FILE__,__LINE__);
            while ($cat = mysql_fetch_array($res))
                $subcats[] = $cat;
        }
        foreach ($subcats as $cat)
            if ($cat[$key] == $search)
                $filtered[] = $cat;
        return $filtered;
    }
    
    function get_tree($parent_id = 0) {
        $tree = array();
        $cats = subcat_filter($parent_id);
        foreach ($cats as $cat) {
            $subcats = get_tree($cat['id']);
            $tree[$cat['id']] = array(
                'id' => $cat['id'],
                'pid' => $cat['pid'],
                'name' => $cat['name'],
                'subdata' => (!empty($subcats) ? $subcats : ''),
            );
        }
        return $tree;
    }
    
    $categories = get_tree(1);
    print_r($categories);
    die;
    [/more]

    Потом надо массив обработать уже таким образом что-бы на выходе было именно вот такое:

    Код:
    <span style="cursor: pointer;" onclick="javascript: show_hide('c4')">
        <img border="0" src="pic/plus.gif" id="picc4" title="Показать">&nbsp;<b>Жанр</b>
    </span>
    В такую конструкцию заключается категория у которой subdata не пустой где:
    c4 - c$id т.е символ "c" и далее номер категории.

    Далее после этого идет вот такой вывод:

    Код:
    <span id="sc4" style="display: none;">
        <input type="checkbox" name="subcat[]" id="subcat10" value="10" /><label for="subcat10">Драма</label><br />
        <input type="checkbox" name="subcat[]" id="subcat11" value="11" /><label for="subcat11">Комедия</label><br />
        <input type="checkbox" name="subcat[]" id="subcat12" value="12" /><label for="subcat12">Боевик</label><br />
        <input type="checkbox" name="subcat[]" id="subcat13" value="13" /><label for="subcat13">Фильм-катастрофа</label><br />
    </span>
    Где sc - sc$id той категории ветви которой обрабатываем.

    Ну и далее ясно тоже:
    for="subcat10" где subcat10 - subcat$id уже текущщей категории (не родительской)
    value="10" где 10 - $id тек категории.

    [more]
    HTML:
    <script language="javascript" type="text/javascript" src="show_hide.js"></script>
    <span style="cursor: pointer;" onclick="javascript: show_hide('c4')">
        <img border="0" src="pic/plus.gif" id="picc4" title="Показать">&nbsp;<b>Жанр</b>
    </span><br />
    <span id="sc4" style="display: none;">
        <input type="checkbox" name="subcat[]" id="subcat10" value="10" /><label for="subcat10">Драма</label><br />
        <input type="checkbox" name="subcat[]" id="subcat11" value="11" /><label for="subcat11">Комедия</label><br />
        <input type="checkbox" name="subcat[]" id="subcat12" value="12" /><label for="subcat12">Боевик</label><br />
        <input type="checkbox" name="subcat[]" id="subcat13" value="13" /><label for="subcat13">Фильм-катастрофа</label><br />
    </span>
    <span style="cursor: pointer;" onclick="javascript: show_hide('c14')">
        <img border="0" src="pic/plus.gif" id="picc14" title="Показать">&nbsp;<b>Носитель</b>
    </span><br />
    <span id="sc14" style="display: none;">
        <span style="cursor: pointer;" onclick="javascript: show_hide('c15')">
            <img border="0" src="pic/plus.gif" id="picc15" title="Показать">&nbsp;<b>DVD</b>
        </span><br />
        <span id="sc15" style="display: none;">
            <input type="checkbox" name="subcat[]" id="subcat26" value="26" /><label for="subcat26">DVD-5</label><br />
            <input type="checkbox" name="subcat[]" id="subcat27" value="27" /><label for="subcat27">DVD-9</label><br />
        </span>
        <input type="checkbox" name="subcat[]" id="subcat16" value="16" /><label for="subcat16">BluRay</label><br />
    </span>
    <span style="cursor: pointer;" onclick="javascript: show_hide('c17')">
        <img border="0" src="pic/plus.gif" id="picc17" title="Показать">&nbsp;<b>Год выпуска</b>
    </span><br />
    <span id="sc17" style="display: none;">
        <input type="checkbox" name="subcat[]" id="subcat18" value="18" /><label for="subcat18">&lt; 1970</label><br />
        <input type="checkbox" name="subcat[]" id="subcat19" value="19" /><label for="subcat19">&lt; 1980</label><br />
        <input type="checkbox" name="subcat[]" id="subcat20" value="20" /><label for="subcat20">&lt; 1990</label><br />
        <input type="checkbox" name="subcat[]" id="subcat21" value="21" /><label for="subcat21">&lt; 2000</label><br />
        <input type="checkbox" name="subcat[]" id="subcat22" value="22" /><label for="subcat22">&lt; 2005</label><br />
        <input type="checkbox" name="subcat[]" id="subcat23" value="23" /><label for="subcat23">2006</label><br />
        <input type="checkbox" name="subcat[]" id="subcat24" value="24" /><label for="subcat24">2007</label><br />
        <input type="checkbox" name="subcat[]" id="subcat25" value="25" /><label for="subcat25">2008</label><br />
    </span>
    [/more]

    Собственно вопрос такой - я пробовал сделать обработку после этого но были баги. Не мог-бы кто-нить написать уже готовый код что делает такой вывод, а дальше я сам уже доделаю и если что - поправлю баги?
     
Статус темы:
Закрыта.