пишу доску объявлений и столкнулся с проблемой создания разделов и категьорий, а именно нужно сделать возможность вложений хотябы до 3 уровней. Созадал базу для разделов 1 уровень: id название Созадал базу для подраздела 2 уровень: id название idразедла сижу вот и думую как можно сделть много уровность, понимаю что нужно хранить массив idразделов но в какой таблице непойму. дайти подсказу или примерчик кода очень нужна ваша помащь
nAgi В DLE сделано так: каждый раздел имеет уникальный id и поле parent_id - т.е. id родительского раздела. Соответственно, разделы, у которых parent_id=1 - выводятся в разделе с id=1, при этом как видишь сама собой отпадает проблема вложености.
теж написали: так можно до бесконечности, а если хочеш чтоб это еще и быстро работало - опять же http://phpclub.ru/faq/Tree?v=w5u
Речь я понимаю идет именно о выводе дерева. Так что парент само собой но вот алгоритм подщета вывода это другое дело. Гдето здесь на форуме уже встречался такой вопрос, написаный помойму мною же ака xak2. Поищи внимательнее там ктото писал красивый алгоритм.
ВОТ СОБРАЛ КОНСТРУКТОР ИЗ СКРИПТОВ ВОТ СОБРАЛ КОНСТРУКТОР ИЗ СКРИПТОВ КОТРЫЕ НАШЕЛ НА ФОРУМЕ. Работает но не работет как я быхотел. Дерево нужно отобразить в списке! Непойму почемувот эти значение не сравниваются в цикле IF но если $idr ставлю 16 то выводится ветвь запорожцев $idr =$tree[$i]['id'];//16= ЗАПАРОЖЦЫ $idpodrazdel=$tree[$i]['idradel']; [sql]DROP TABLE IF EXISTS `jos_vitrina_section`; CREATE TABLE `jos_vitrina_section` ( `id` int(11) NOT NULL auto_increment, `idradel` int(1) NOT NULL default '0', `namesection` varchar(200) NOT NULL default '0', `publish` int(1) NOT NULL default '1', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=20 ; -- -- Дамп данных таблицы `jos_vitrina_section` -- INSERT INTO `jos_vitrina_section` VALUES (1, 0, 'Рыбалка', 1); INSERT INTO `jos_vitrina_section` VALUES (2, 0, 'Охота', 1); INSERT INTO `jos_vitrina_section` VALUES (3, 1, 'Удочки', 1); INSERT INTO `jos_vitrina_section` VALUES (5, 1, 'Леска', 1); INSERT INTO `jos_vitrina_section` VALUES (6, 1, 'Спиннинг', 1); INSERT INTO `jos_vitrina_section` VALUES (7, 1, 'Катушки', 1); INSERT INTO `jos_vitrina_section` VALUES (8, 1, 'Лодки', 1); INSERT INTO `jos_vitrina_section` VALUES (9, 2, 'Ружья', 1); INSERT INTO `jos_vitrina_section` VALUES (10, 2, 'Патроны', 1); INSERT INTO `jos_vitrina_section` VALUES (11, 2, 'Одежда охотника', 1); INSERT INTO `jos_vitrina_section` VALUES (12, 2, 'Палатки', 1); INSERT INTO `jos_vitrina_section` VALUES (13, 0, 'Машины', 1); INSERT INTO `jos_vitrina_section` VALUES (14, 13, 'жигули', 1); INSERT INTO `jos_vitrina_section` VALUES (15, 13, 'шеврале', 1); INSERT INTO `jos_vitrina_section` VALUES (16, 13, 'запарожец', 1); INSERT INTO `jos_vitrina_section` VALUES (17, 16, '1м запарожец', 1); INSERT INTO `jos_vitrina_section` VALUES (18, 16, '2 запарожец', 1); INSERT INTO `jos_vitrina_section` VALUES (19, 16, '3 запарожец', 1);[/sql] PHP: $hostName = "localhost"; $userName = "root"; $password = ""; $databaseName = "Joomla13"; if (!($link=mysql_connect($hostName,$userName,$password))) { printf("Ошибка при соединении с MySQL !\n"); exit(); } if (!mysql_select_db($databaseName, $link)) { printf("Ошибка базы данных !"); exit(); } /* * ID - Идентификатор ветки * PID - Родительский ID (если pid=0 значит это самая первая ветка) * FIELD1, FIELD2,... - Поля таблицы * ----- * * @return array */ function &make_tree() { $tree = array(); $query = mysql_query('select * from jos_vitrina_section order by id'); if (! $query) return $tree; $nodes = array(); $keys = array(); while (($node = mysql_fetch_assoc($query))) { //if ($node['childs'] === '1') //если есть поле определяющее наличие дочерних веток // $node['nodes'] = array(); //то добавляем к записи узел (массив дочерних веток) на данном этапе $nodes[$node['id']] =& $node; //заполняем список веток записями из БД $keys[] = $node['id']; //заполняем список ключей(ID) unset($node); } mysql_free_result($query); foreach ($keys as $key) { /** * если нашли главную ветку(или одну из главных), то добавляем * её в дерево */ if ($nodes[$key]['idradel'] === '0') $tree[] =& $nodes[$key]; /** * else находим родительскую ветку и добавляем текущую * ветку к дочерним элементам родит.ветки. */ else { if (isset($nodes[ $nodes[$key]['idradel'] ])) //на всякий случай, вдруг в базе есть потерянные ветки { if (! isset($nodes[ $nodes[$key]['idradel'] ]['nodes'])) //если нет поля определяющего наличие дочерних веток $nodes[ $nodes[$key]['idradel'] ]['nodes'] = array(); //то добавляем к записи узел (массив дочерних веток) на данном этапе $nodes[ $nodes[$key]['idradel'] ]['nodes'][] =& $nodes[$key]; } } } return $tree; } $tree =&make_tree(); //echo $tree[2]['namesection']."<br>".$tree[2]['nodes'][2]['namesection'];//прямой запрос к значению в массиве /* echo"<PRE>"; print_r($tree); echo"</PRE>"; */ $array_tree=array();//окнчательный массив $array_tovar=array(); $array_tovar_tree=array(); function tree_print(&$tree) { global $array_tovar, $array_tovar_tree; //условие завершения рекурсии //Условие, при котором функция никогда не вызывает сама себя // - элемент массива не определен // - элемент массива определен, но является пустым массивом if(empty($tree)) return; //функция empty() - вернет ложь во всех нужных нам случаях: //echo "<select>"; for($i=0;$i<count($tree);$i++) { $idr =$tree[$i]['id'];//16= ЗАПАРОЖЦЫ $idpodrazdel=$tree[$i]['idradel']; IF($idpodrazdel == 0) { array_push($array_tovar,"<option><a href= ".$tree[$i]['id'].">".$tree[$i]['namesection']."</a></option>"); }else{//echo "ветки и подветки"; IF($idpodrazdel == $idr) //ВОТ ТУТ НЕРАБОТЕТ СРАВНЕИЕ НО ЕСЛИ ПОСТАВТЬ ПРИНУДИТЕЛЬНО 16 ТО ПОЯВИТСЯ ЕЩЕ ОДНА ВЕТВЬ { array_push($array_tovar,"<option><a href= ".$tree[$i]['id'].">------>(".$tree[$i]['id'].")".$tree[$i]['namesection']."</a></option>"); }else{ array_push($array_tovar,"<option><a href= ".$tree[$i]['id'].">->(".$tree[$i]['id'].")".$tree[$i]['namesection']."</a></option>"); } } tree_print($tree[$i]['nodes']); } } tree_print($tree); echo" <select class=\"\" name=\"idrazdel\"' >".implode(' ', $array_tovar)."</select> ";//<option value= \"0\" '> [ Раздел ]</option>
выводит ввиде списка LI но я немогу его переделать под правильное выведение в список <select> PHP: function tree_print(&$tree) { if(empty($tree)) return; echo "<ul>"; for($i=0;$i<count($tree);$i++) { echo "<li>".$tree[$i]['namesection']; tree_print($tree[$i]['nodes']); echo "</li>"; } echo "</ul>"; } tree_print($tree); [/php]
Я когда в последний раз что-то подобное делал, всю структуру каталога(было 4 уровня) хранил в одной строке)
Всё сделал теперь дерево отображается в списке с отступами вот рабочий код тем каму нужно будит в бущем Код (Text): <? $array_level=array(); function tree_print(&$tree,$l,$id,$idradel,$padding) { global $array_level; if(empty($tree)) return; for($i=0;$i<count($tree);$i++) { $styler="padding: 0px ".$padding."px;";//стиль CSS IF($id = $idradel){ $styler="padding: 0px ".($padding+10)."px;"; } IF($l == 0){ //echo "<b>(".$tree[$i]['id'].")".$tree[$i]['namesection']."</b><br>"; array_push($array_level,"<option style=\"".@$styler."\" value=\"".$tree[$i]['id']."\">".$tree[$i]['namesection']."</option>"); }else{ //echo"<i style=\"".@$styler."\">(".$tree[$i]['id'].")".$tree[$i]['namesection']."</i><br>"; array_push($array_level,"<option style=\"".@$styler."\" value=\"".$tree[$i]['id']."\">".$tree[$i]['namesection']."</option>"); } tree_print($tree[$i]['nodes'],1,$tree[$i]['id'],$tree[$i]['idradel'],($padding+10)); /* echo "<PRE>"; print_r($tree[$i]['nodes']);//выводит масиив деревьев для информации echo "</PRE>"; */ } } tree_print($tree,0,0,0,10);//запуск построения дерева ?>