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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вывод древовидной структуры из БД [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Помогите с реализацией условия
Саныч Модератор
Отправлено: 12 Июля, 2011 - 17:43:48
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Мелкий, сорри! Это я дурак Улыбка Я забыл про те елементы, у которых нет потомков Забыл для них ведь тоже будет запрос... Вобщем вы правы


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Мелкий Супермодератор
Отправлено: 12 Июля, 2011 - 17:59:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)





Саныч, ага, я так и подумал. Бывает, в общем Подмигивание


-----
PostgreSQL DBA
 
 Top
OrmaJever Модератор
Отправлено: 12 Июля, 2011 - 18:14:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Мелкий пишет:
OrmaJever, вообще-то 4 - это будет результатов.
А запросов будет 11. Без запроса не узнаешь, есть ли дочерние элементы.

Внимательный же... Растерялся
Да точно запросов будет 11. Мелкий а что скажешь по теме, что лутше запросы в бд или масив?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 12 Июля, 2011 - 19:20:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




OrmaJever пишет:
Мелкий а что скажешь по теме, что лутше запросы в бд или масив?

Для отображения структуры - лучше 1 запрос. Массив ключ-строка чрезвычайно компактен, двухмерный массив 100х100 6-символьных строк занимает по данным memory_get_peak_usage (т.е. ещё со всем окружением PHP) 1464796 байта, что как-то ни о чём.

(Отредактировано автором: 12 Июля, 2011 - 19:21:32)



-----
PostgreSQL DBA
 
 Top
Saymor
Отправлено: 12 Июля, 2011 - 21:16:34
Post Id



Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Мелкий пишет:
isset($tree[$id])

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

я попробовал

и

и

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

ещё советы?

(Отредактировано автором: 12 Июля, 2011 - 21:16:57)

 
 Top
OrmaJever Модератор
Отправлено: 12 Июля, 2011 - 21:56:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Вот вариант с масивом
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 - с масивом
Разница не очень, но вобщем вам судить Подмигивание


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 12 Июля, 2011 - 21:57:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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

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

У вас ведь массив: ключ - id родителя, значение - простой числовой массив детей этого родителя. Ну и чтобы узнать, является ли этот элемент конечной ветвью - надо проверить, чтобы его id не было в ключах первого массива $tree[вот тута].


-----
PostgreSQL DBA
 
 Top
Saymor
Отправлено: 13 Июля, 2011 - 17:47:04
Post Id



Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




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>";
}


работает не совсем так как мне надо..
 
 Top
Saymor
Отправлено: 13 Июля, 2011 - 23:19:12
Post Id



Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Господа!
так кто подскажет как сделать последние дочерние элементы ссылками??
(Добавление)
походу один я 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.     } ?>


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

(Отредактировано автором: 14 Июля, 2011 - 00:12:34)

 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB