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 » PHP » SQL и Архитектура БД » Рекурсивное создание массива

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

16. Kubert - 23 Августа, 2011 - 17:15:48 - перейти к сообщению
Господа хотелось бы продолжить тему, так как достиг неких результатов, но не финишировал!
Даю все что имею! Закатив глазки


БД:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. id = обычный ID
  3. pid = его родитель
  4. sort = сортировка
  5. name = имя
  6. idObject = ссылка на какой-то id объекта (это не важно)
  7.  
  8. id | pid | sort | name | idObject
  9. 1 | 0 | 9999 | Категория 1 | ###
  10. 2 | 1 | 9999 | Категория 1.1 | ###
  11. 3 | 1 | 9999 | Категория 1.2 | ###
  12. 4 | 3 | 9999 | Категория 1.2.1 | ###
  13. 5 | 4 | 9999 | Категория 1.2.1.1 | ###
  14. 6 | 4 | 9999 | Категория 1.2.1.2 | ###
  15. 7 | 0 | 9999 | Категория 2 | ###
  16. 8 | 0 | 9999 | Категория 3 | ###
  17.  
  18. и так далее...
  19.  



ЗАДАЧА:
Необходимо преобразовать данные из MySQL в массив такого вида:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $tree=array(
  3.    array('id'=>'1','name'=>'Категория 1','url'=>'###','tree'=>array(
  4.       array('id'=>'2','name'=>'Категория 1.1','url'=>'###'),
  5.       array('id'=>'3','name'=>'Категория 1.2','url'=>'###','tree'=>array(
  6.          array('id'=>'4','name'=>'Категория 1.2.1','url'=>'###','tree'=>array(
  7.             array('id'=>'5','name'=>'Категория 1.2.1.1','url'=>'###'),
  8.             array('id'=>'6','name'=>'Категория 1.2.1.2','url'=>'###')
  9.          )),
  10.       )),
  11.    )),
  12.    array('id'=>'7','name'=>'Категория 2','url'=>'###'),
  13.    array('id'=>'8','name'=>'Категория 3','url'=>'###')
  14. );
  15.  


ДЕЛАЮ ТАК:
mysql_connect("localhost","root","webmaster") or die (mysql_error());
mysql_select_db("mydemo") or die (mysql_error());

$queryresult = mysql_query('SELECT id,pid,name,idObject FROM category ORDER BY sort,id');
while($row = mysql_fetch_assoc($queryresult)){
$arrAll[] = array(
'id'=>$row['id'],
'pid'=>$row['pid'],
'name'=>$row['name'],
'idObject'=>$row['idObject']
);
}

Теперь осталось только "переконвертировать" массив из одного вида в другой с помощью рекурсивной функции.
Но у меня не выходит.
17. LIME - 23 Августа, 2011 - 17:52:34 - перейти к сообщению
ну если tree это и есть pid
то возможно так
PHP:
скопировать код в буфер обмена
  1. function toTree(&$arrAll){
  2. foreach ($arrAll as &$val){
  3. if (isset($val['pid'])) {
  4.  $val['pid']=$arrAll['pid'];
  5. toTree($val['pid']);
  6. }
  7. }
  8. }

только тут надо быть очень осторожным в построении базы чтоб не получилось бесконечного цикла изза рекурсии
(Добавление)
можно навсякий сделать проверку уровня вложенности
передавать еще и флаг вложенности инкриментируя его в вызове внутри фции
и проверять
при достижении максимальной вложенности чтото делать
18. Kubert - 23 Августа, 2011 - 18:06:13 - перейти к сообщению
LIME
Чтото не работает...

CODE (htmlphp):
скопировать код в буфер обмена
  1. mysql_connect("localhost","root","webmaster") or die (mysql_error());
  2. mysql_select_db("mydemo") or die (mysql_error());
  3. mysql_query("set character_set_client   ='cp1251'");
  4. mysql_query("set character_set_results  ='cp1251'");
  5. mysql_query("set collation_connection   ='cp1251_general_ci'");
  6.  
  7. $queryresult = mysql_query('SELECT id,pid,name,idObject FROM category ORDER BY sort,id');
  8. while($row = mysql_fetch_assoc($queryresult)){
  9.         $arrAll[] = array(
  10.                 'id'=>$row['id'],
  11.                 'pid'=>$row['pid'],
  12.                 'name'=>$row['name'],
  13.                 'idObject'=>$row['idObject']
  14.         );
  15. }
  16.  
  17.  
  18. function toTree(&$arrAll){
  19.         foreach($arrAll as &$val){
  20.                 if(isset($val['pid'])){
  21.                         $val['pid']=$arrAll['pid'];
  22.                         toTree($val['pid']);
  23.                 }
  24.         }
  25. }
  26. toTree($arrAll);
  27.  
  28.  
  29. print_r($val);
  30.  
19. LIME - 23 Августа, 2011 - 18:14:02 - перейти к сообщению
во первых надо делать вывод ошибок
вам бы указали что $val неопределен
ведь изменяется исходный массив
20. Kubert - 23 Августа, 2011 - 18:18:29 - перейти к сообщению
LIME
Тоже самое. только теперь у элемента pid равно "пустота"

Ну не тоже самое конечно, но не работает
21. DeepVarvar - 23 Августа, 2011 - 18:23:27 - перейти к сообщению
Оно???
22. LIME - 23 Августа, 2011 - 18:24:55 - перейти к сообщению
а точно
вкралась ошибка
вы попробуйте понять замысел и сами отлаживайте
PHP:
скопировать код в буфер обмена
  1. function toTree(&$arrAll){
  2.         foreach($arrAll as &$val){
  3.                 if(isset($val['pid'])){
  4.                         $val['pid']=$arrAll[$val['pid']];
  5.                         toTree($val['pid']);
  6.                 }
  7.         }
  8. }
23. Kubert - 23 Августа, 2011 - 18:27:31 - перейти к сообщению
DeepVarvar
ну да... Этого я хочу достичь... Дерево)
24. DeepVarvar - 23 Августа, 2011 - 18:35:03 - перейти к сообщению
LIME уже написал - цэ рекурсия, затачивайте под себя.

А у меня уже со стилями - заточено.
25. Kubert - 23 Августа, 2011 - 18:35:57 - перейти к сообщению
LIME
Ты меня уж прости)!
Я пытаюсь понять, серьезно!

У тебя последний вариант работает?!
У меня 2 ошибки...

Notice: Undefined индекса: 1 вход / var/www/clients/client2/web7/web /test/26/index.php в строке 23

Фатальная ошибка: Только переменные могут быть переданы по ссылке в / var/www/clients/client2/web7/web /test/26/index.php в строке 24


Короче, буду пробывать, отпишу завтра или вечером... Сейчас уже не могу...

 

Powered by ExBB FM 1.0 RC1