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]   

> Описание: из Mysql
Kubert
Отправлено: 23 Августа, 2011 - 17:15:48
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


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




Господа хотелось бы продолжить тему, так как достиг неких результатов, но не финишировал!
Даю все что имею! Закатив глазки


БД:
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']
);
}

Теперь осталось только "переконвертировать" массив из одного вида в другой с помощью рекурсивной функции.
Но у меня не выходит.
 
 Top
LIME
Отправлено: 23 Августа, 2011 - 17:52:34
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




ну если 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. }

только тут надо быть очень осторожным в построении базы чтоб не получилось бесконечного цикла изза рекурсии
(Добавление)
можно навсякий сделать проверку уровня вложенности
передавать еще и флаг вложенности инкриментируя его в вызове внутри фции
и проверять
при достижении максимальной вложенности чтото делать

(Отредактировано автором: 23 Августа, 2011 - 17:52:58)

 
 Top
Kubert
Отправлено: 23 Августа, 2011 - 18:06:13
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


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




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.  
 
 Top
LIME
Отправлено: 23 Августа, 2011 - 18:14:02
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




во первых надо делать вывод ошибок
вам бы указали что $val неопределен
ведь изменяется исходный массив
 
 Top
Kubert
Отправлено: 23 Августа, 2011 - 18:18:29
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


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




LIME
Тоже самое. только теперь у элемента pid равно "пустота"

Ну не тоже самое конечно, но не работает

(Отредактировано автором: 23 Августа, 2011 - 18:20:49)

 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Августа, 2011 - 18:23:27
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Оно???
Прикреплено изображение (Нажмите для увеличения)
1.png
 
 Top
LIME
Отправлено: 23 Августа, 2011 - 18:24:55
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




а точно
вкралась ошибка
вы попробуйте понять замысел и сами отлаживайте
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. }
 
 Top
Kubert
Отправлено: 23 Августа, 2011 - 18:27:31
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


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




DeepVarvar
ну да... Этого я хочу достичь... Дерево)
 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Августа, 2011 - 18:35:03
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




LIME уже написал - цэ рекурсия, затачивайте под себя.

А у меня уже со стилями - заточено.
 
 Top
Kubert
Отправлено: 23 Августа, 2011 - 18:35:57
Post Id



Частый гость


Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010  


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




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


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

(Отредактировано автором: 23 Августа, 2011 - 18:37:23)

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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB