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 :: Версия для печати :: Категории и подкатегории [5]
Форумы портала PHP.SU » » Работа с СУБД » Категории и подкатегории

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

61. _tango - 10 Апреля, 2010 - 23:33:42 - перейти к сообщению
Вот окончательный вариант:

CODE (SQL):
скопировать код в буфер обмена
  1. $queryresult = mysql_query('SELECT id, parent_id, title FROM testcat ORDER BY parent_id, id');


PHP:
скопировать код в буфер обмена
  1. while ($row = mysql_fetch_assoc($queryresult)) {
  2.         $menu[$row['parent_id']][$row['id']] = $row['title'];
  3. }
  4.  
  5. foreach ($menu[0] as $CatId => $CatName )
  6. {
  7.  echo $CatName."<br />";
  8.  foreach ($menu[$CatId] as $ItemId => $ItemName)
  9.  {
  10.   echo $ItemName."<br />";
  11.  }
  12. }
  13.  


Хорошо иппон!!! Радость
62. JustUserR - 11 Апреля, 2010 - 14:43:28 - перейти к сообщению
_tango пишет:
Вот окончательный вариант
В принципе решение неплохое но его можно универсализировать для любого уровня вложенности - сначала выбираете все корневые элементы и кладте их в хеш-массив - далее для каждого из них просматриваете дочерние элементы и если такове имеются то для значенем ключа данного элеента становится хеш-массив его дочерних элементов (Здесь также имя элемента - это ключ хеш-массива а не его значение) - а если дочернх элементов нет то устанавливаете null - таким образом поучаете полное дерево
63. _tango - 12 Апреля, 2010 - 14:10:28 - перейти к сообщению
Извините пожалуйста, но не могли бы вы привести в пример код, ну например для трех уровней вложенности? Что бы можно было потом над ним помедитировать Закатив глазки
Очень уж тяжело, пока что, дается эта околоматематическая акробатика Радость
64. JustUserR - 13 Апреля, 2010 - 16:38:11 - перейти к сообщению
_tango Вот вам пример кода который будет упорядочивать рекурсивно массив и превращать его в дерево по идентификаторам родительских элементов - при этом он работает с произвольным уровнем вложенности
PHP:
скопировать код в буфер обмена
  1. $v_arr=array(array(ID=>"0", value=>"Zero", parent=>"-1"),array(ID=>"1", value=>"One", parent=>"0"), array(ID=>"2", value=>"Two", parent=>"0"),array(ID=>"3", value=>"Three", parent=>"1"));
  2. $v_tree=array();
  3. function built_tree($arr,&$tree,$par_id=-1)
  4.  { for($i=0;$i<count($arr);$i++)
  5.     { if($arr[$i]['parent']==$par_id)
  6.        { if(is_array($tree))
  7.           { $tree[$arr[$i]['ID']]=null; }
  8.          else { $tree=array();
  9.                 $tree[$arr[$i]['ID']]=null;
  10.               }
  11.          built_tree($arr,$tree[$arr[$i]['ID']],$arr[$i]['ID']);
  12.        }
  13.       else {}
  14.     }
  15.  }
  16. print_r($v_arr);
  17. print_r($v_tree);
  18.  
65. _tango - 14 Апреля, 2010 - 16:02:47 - перейти к сообщению
Большое спасибо JustUserR Улыбка
66. JustUserR - 15 Апреля, 2010 - 13:23:13 - перейти к сообщению
_tango пишет:
Большое спасибо JustUserR
Используйте на здоровье Улыбка Обратите внимание что второй аргумент приведенной функции является ссылкой
67. Ghost - 18 Января, 2011 - 19:41:35 - перейти к сообщению
Здравствуйте.

Хотел бы возобновить старую тему.
У меня аналогичная "загвоздка", никак не могу найти решение.
Нужно рекурсией собрать массив из id-значений для вывода комментариев.

Вывожу часть данных из БД:

PHP:
скопировать код в буфер обмена
  1.     $res = mysqlQuery("SELECT `id`, `reply`, `text`
  2.                         FROM `tbl` ");
  3.  
  4.     // reply - родительский id
  5.  
  6.     if(mysql_num_rows($res) > 0)
  7.     {
  8.       while($row = mysql_fetch_assoc($res))
  9.       {
  10.         $tree[$row['reply']][$row['id']] = $row['text'];
  11.       }
  12.     }


Прохожусь по всему дереву:

PHP:
скопировать код в буфер обмена
  1. function ShowTree($tree, $pid=0)
  2. {
  3.   $data = array();
  4.  
  5.   foreach($tree as $id=>$root)
  6.   {
  7.     if($pid!=$id)
  8.       continue;
  9.  
  10.       if(count($root))
  11.       {
  12.         foreach($root as $key => $title)
  13.         {
  14.          // echo '<h1>'. $key .'</h1>';
  15.          
  16.          if(count($tree[$key]))
  17.            ShowTree($tree,$key);
  18.         }
  19.       }
  20.  
  21.    }
  22.  
  23.  return $data;
  24. }
  25.  
  26. $dt = ShowTree($tree);


Раскомментировать echo $key; - выводятся значения в порядке в каком нужно (несколько уровней вложенности), но дело в том, что в БД хранится не только текст, но и другие данные, которые я затем через foreach($dt ... ) хотел бы вывести из БД в нужном порядке. Простое присваивание значения $key массиву ничего не даёт - заносятся только значения первого уровня.

Подскажите, пожалуйста, возможно ли собрать в массив все идентификаторы в нужном порядке? Как это можно сделать?

Кстати, выдаётся Notice: Undefined offset: ... in ... на
CODE (htmlphp):
скопировать код в буфер обмена
  1. if(count($tree[$key])) ShowTree($tree,$key);


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

Буду очень признателен за помощь.
68. Riv3ro - 26 Августа, 2011 - 12:11:57 - перейти к сообщению
не хотел создавать новую тему для своего вопроса...

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

вот что есть

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.  
  3. id      parent_id       name
  4. 1       0       Ванны
  5. 2       0       Мебель для Ванны
  6. 3       1       Ванны чугунные
  7. 4       1       Ванны акриловые
  8. 5       2       Столы
  9. 6       2       Вешалки
  10.  
  11.  



PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $queryresult = mysql_query('SELECT id, parent_id, name FROM testcat ORDER BY parent_id, id');
  4.        
  5.         while ($row = mysql_fetch_assoc($queryresult))
  6.         {
  7.                 $menu[$row['parent_id']][$row['id']] = $row['name'];
  8.        
  9.         }
  10.          
  11.         foreach ($menu[0] as $CatId => $CatName )
  12.         {
  13.                  echo "<li><a>$CatName</a></li>";
  14.                  
  15.                  echo "<li>";
  16.                  foreach ($menu[$CatId] as $ItemId => $ItemName)
  17.                  {
  18.                        
  19.                         echo "<p><a href='view_cat.php?cat='>&#8594; $ItemName</a></p>";
  20.                        
  21.                  }
  22.                  echo "</li>";
  23.         }
  24.  
  25.  


Получается меню, с категориями и под категориями. Но я не могу сообразить как лучше сделать теперь ссылки ?

Если в <a href='view_cat.php?cat='> подставить $CatId то будет попадать на parent_id а там есть дубли =\

 

Powered by ExBB FM 1.0 RC1