Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вывод древовидной структуры из БД [2]
Форумы портала PHP.SU » » Работа с СУБД » Вывод древовидной структуры из БД

Страниц (2): « 1 [2]
 

16. Саныч - 12 Июля, 2011 - 17:43:48 - перейти к сообщению
Мелкий, сорри! Это я дурак Улыбка Я забыл про те елементы, у которых нет потомков Забыл для них ведь тоже будет запрос... Вобщем вы правы
17. Мелкий - 12 Июля, 2011 - 17:59:48 - перейти к сообщению

Саныч, ага, я так и подумал. Бывает, в общем Подмигивание
18. OrmaJever - 12 Июля, 2011 - 18:14:42 - перейти к сообщению
Мелкий пишет:
OrmaJever, вообще-то 4 - это будет результатов.
А запросов будет 11. Без запроса не узнаешь, есть ли дочерние элементы.

Внимательный же... Растерялся
Да точно запросов будет 11. Мелкий а что скажешь по теме, что лутше запросы в бд или масив?
19. Мелкий - 12 Июля, 2011 - 19:20:17 - перейти к сообщению
OrmaJever пишет:
Мелкий а что скажешь по теме, что лутше запросы в бд или масив?

Для отображения структуры - лучше 1 запрос. Массив ключ-строка чрезвычайно компактен, двухмерный массив 100х100 6-символьных строк занимает по данным memory_get_peak_usage (т.е. ещё со всем окружением PHP) 1464796 байта, что как-то ни о чём.
20. Saymor - 12 Июля, 2011 - 21:16:34 - перейти к сообщению
Мелкий пишет:
isset($tree[$id])

хм.. а где вы взяли из моего примера $id ?

я попробовал

и

и

однако условие выполняется не так как нужно

ещё советы?
21. OrmaJever - 12 Июля, 2011 - 21:56:40 - перейти к сообщению
Вот вариант с масивом
PHP:
скопировать код в буфер обмена
  1. $q = mysql_query('SELECT id,name,parent FROM category');
  2. $arr = array();
  3. while($ob = mysql_fetch_object($q)) {
  4.         $arr[$ob->id] = array('parent' => $ob->parent, 'name' => $ob->name);
  5. }
  6.  
  7. // вызываем рекурсивную функцию, передаём ей массив
  8.  ShowCategory($arr, 0);
  9.  
  10. // создаём рекурсивную функцию
  11. function ShowCategory(&$arr, $parent = 0){
  12.  
  13.     // выводим дерево
  14.     echo "<ul>";
  15.  
  16.     foreach($arr as $k => $v) {
  17.       echo "<li>";
  18.       if($v['parent'] != $parent) continue;
  19.       echo "<a href='index.php?category=".$k."'>".$v['name']."</a>";
  20.       ShowCategory($arr, $k);
  21.       echo "</li>";
  22.     }
  23.     echo "</ul>";
  24. }

И я зделал несколько тестов и вот средний результат времени за 10 проверок
0.0123 - с базой
0.0097 - с масивом
Разница не очень, но вобщем вам судить Подмигивание
22. Мелкий - 12 Июля, 2011 - 21:57:46 - перейти к сообщению
Saymor пишет:
хм.. а где вы взяли из моего примера $id ?

$i имелся в виду, базу рисовал, по привычке id пишу Закатив глазки

У вас ведь массив: ключ - id родителя, значение - простой числовой массив детей этого родителя. Ну и чтобы узнать, является ли этот элемент конечной ветвью - надо проверить, чтобы его id не было в ключах первого массива $tree[вот тута].
23. Saymor - 13 Июля, 2011 - 17:47:04 - перейти к сообщению
OrmaJever пишет:
$q = mysql_query('SELECT id,name,parent FROM category');
$arr = array();
while($ob = mysql_fetch_object($q)) {
$arr[$ob->id] = array('parent' => $ob->parent, 'name' => $ob->name);
}

// вызываем рекурсивную функцию, передаём ей массив
ShowCategory($arr, 0);

// создаём рекурсивную функцию
function ShowCategory(&$arr, $parent = 0){

// выводим дерево
echo "<ul>";

foreach($arr as $k => $v) {
echo "<li>";
if($v['parent'] != $parent) continue;
echo "<a href='index.php?category=".$k."'>".$v['name']."</a>";
ShowCategory($arr, $k);
echo "</li>";
}
echo "</ul>";
}


работает не совсем так как мне надо..
24. Saymor - 13 Июля, 2011 - 23:19:12 - перейти к сообщению
Господа!
так кто подскажет как сделать последние дочерние элементы ссылками??
(Добавление)
походу один я batman Сомбреро

решение на свой вопрос нашел сам!
вот решение:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.     // делаем запрос
  3.     $cats = "SELECT id,name,parent FROM category";
  4.      
  5.     // создаем многомерный массив
  6.     $tree = array();
  7.     for($i=0,$n=count($cats); $i<$n; $i++){
  8.      $cat = $cats[$i];
  9.             if(empty($tree[$cat->parent]))
  10.                     $tree[$cat->parent]=array();
  11.             $tree[$cat->parent][] = $cat;
  12.     }
  13.      
  14.     // вызываем рекурсивную функцию, передаём ей массив
  15.      ShowCategory($tree);
  16.      
  17.     // создаём рекурсивную функцию
  18.     function ShowCategory(&$tree,$k_parent=0, $count=0){ // добавляем $count
  19.         #########################
  20.        if(empty($tree[$k_parent])) return; ## НЕ ВИЖУ СМЫСЛА В ДАННОЙ СТРОКЕ
  21.        ## ТАК КАК И БЕЗ НЕЁ ВСЕ РАБОТАЕТ, А ВЫ КАК ДУМАЕТЕ?
  22.    
  23.         // выводим дерево
  24.         echo $k_parent ? "<ul>" : "";
  25.         for($i=0,$n=count($tree[$k_parent]); $i<$n; $i++){
  26.  
  27.         ####### Добавляем строчку кода, которая считает кол-во конечных потомков
  28.            @$count = count($tree[$tree[$k_parent][$i]->id]);
  29.         ######################################################
  30.  
  31.             echo "<li>";
  32.  
  33.             ##########################
  34.            if($count){ // если $count==0, то даем ссылку иначе <span>
  35.             ##########################
  36.  
  37.                 echo "<span>".$tree[$k_parent][$i]->name."</span>";
  38.             }else{
  39.                 echo "<a href='index.php?category=".$tree[$k_parent][$i]->id."'>".$tree[$k_parent][$i]->p_name."</a>";
  40.             }
  41.      
  42.             // функция вызывает сама себя с массивом $tree и $tree[$k_parent][$i]->id родителя
  43.             ShowCategory($tree, $tree[$k_parent][$i]->id, $count); // добавляем $count
  44.           echo "</li>";
  45.         }
  46.         echo $k_parent ? "</ul>" : "";
  47.     } ?>


прокомментируйте моё решение, может есть что-то более изящное?

 

Powered by ExBB FM 1.0 RC1