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 :: Сложная рекурсия.

 PHP.SU

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


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

> Без описания
Gerd
Отправлено: 07 Февраля, 2013 - 20:31:23
Post Id



Частый посетитель


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


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

[+][+][+]


Вообщем щас все работает, но через 2 функции. Хотелось бы все в 1, дабы не пересылать лишний раз данные и ускорить работу.
Суть в следующем. Необходима рекурсия, рекурсия на сбор id в возрастающем порядке(до корневой категории).
Как я не пробую, у меня все время сбиваются данные и путаюца переменные. Да во второй функции собранные id, преобразую в массив и тд.

Ну вот есть 3 категории.
1 0-1 категория
2 1--2 категория
3 2---3 категория
От даем в функцию id=3, у нас должно получиться 3,2,1
PHP:
скопировать код в буфер обмена
  1. id_recurs(3);
  2. function id_recurs($id1='', $id2='')
  3. {      
  4.     global $cat_info;
  5.        
  6.         if($cat_info[$id1]['sub_id'] !=0 &){
  7.             $id1 .= ','.id_recurs($cat_info[$id1]['sub_id']);
  8.                
  9.      return $id1;                                      
  10. }
  11.  

Так мы получаем: 3,2,1
Собрали все связанные id с той категорию, id которой отдали функции.

Предположим следующее
1 0-1 категория
2 1--2 категория
3 2---3 категория

4 0-1 категория
5 4--2 категория
6 5---3 категория

Теперь необходимо собрать все связанные id с 6 категорией, у нас должно получиться 6,5,4.
Можно прописать 2 раза

Но охота получить все за 1 раз, то есть должны прописать

И в итоге получить:
PHP:
скопировать код в буфер обмена
  1. return $id1.'|'.$id2; - 3,2,1|6,5,4



В итоге нужно следующее:
PHP:
скопировать код в буфер обмена
  1. function id_recurs($id1='', $id2='')
  2. {      
  3.     global $cat_info;
  4.        
  5.         if($cat_info[$id1]['sub_id'] !=0){
  6.             $id1 .= ','.id_recurs($cat_info[$id1]['sub_id']);
  7.        
  8.         $id1='3,2,1';
  9.         $id1='6,5,4';
  10.         Так, чтобы здесь произвести необходимые действия с подготовленными массивами.
  11.  
  12.      return $id1;                                      
  13. }


Скажите, такое можно сделать? Если да, то не проч посмотреть пример Огорчение

(Отредактировано автором: 07 Февраля, 2013 - 20:35:51)

 
 Top
thesameson
Отправлено: 07 Февраля, 2013 - 22:29:37
Post Id


Новичок


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


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




PHP:
скопировать код в буфер обмена
  1. <?
  2. $cat_info = array(
  3.                 1 => array('sub_id'=>0),
  4.                 2 => array('sub_id'=>1),
  5.                 3 => array('sub_id'=>2),
  6.                
  7.                 4 => array('sub_id'=>0),
  8.                 5 => array('sub_id'=>4),
  9.                 6 => array('sub_id'=>5)
  10.         );
  11.  
  12. $args = array(3,6);
  13. var_dump( id_recurs($args) );
  14.  
  15. function id_recurs($id1)
  16. {      
  17.     global $cat_info;
  18.     if(is_array($id1)) {
  19.                 $result = array_map('id_recurs', $id1);
  20.                 return implode('|', $result);
  21.                
  22.         } else {
  23.         if($cat_info[$id1]['sub_id'] != 0){
  24.             $id1 .= ','.id_recurs($cat_info[$id1]['sub_id']);
  25.         }
  26.                 return $id1;
  27.         }
  28. }
  29.  
  30. ?>
  31.  

Надеюсь вы не собираетесь следующей строчкой: explode('|', $string); ? Подмигивание

(Отредактировано автором: 07 Февраля, 2013 - 22:37:52)

 
 Top
Gerd
Отправлено: 08 Февраля, 2013 - 06:22:22
Post Id



Частый посетитель


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


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

[+][+][+]


Спасибо. Но можно ли отдельно получить $id1 и $id2. Однако
Я хотел создать массив через explode, после чего найти различие между 2-мя массивами.
А так придется разделить по | потом еще раз по запятой. После чего отправить полученные массивы другой функции.

(Отредактировано автором: 08 Февраля, 2013 - 06:24:52)

 
 Top
thesameson
Отправлено: 08 Февраля, 2013 - 09:43:03
Post Id


Новичок


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


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




Gerd пишет:
Спасибо. Но можно ли отдельно получить $id1 и $id2. Однако
Я хотел создать массив через explode, после чего найти различие между 2-мя массивами.
А так придется разделить по | потом еще раз по запятой. После чего отправить полученные массивы другой функции.

Тогда исправьте:
PHP:
скопировать код в буфер обмена
  1.     if(is_array($id1)) {
  2.             return array_map('id_recurs', $id1);
  3.             //return implode('|', $result);
  4.                
  5.         }

И передавайте функции ассоциативный массив.

В результате получите
PHP:
скопировать код в буфер обмена
  1. Array ( [id1] => 3,2,1 [id2] => 6,5,4 )
 
 Top
Gerd
Отправлено: 08 Февраля, 2013 - 11:01:30
Post Id



Частый посетитель


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


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

[+][+][+]


Спс, только если закомментировать строчку. От функции ничего не придет в ответ.
В чем ошибка?
PHP:
скопировать код в буфер обмена
  1. print_r(id_recur(array('id1'=>3, 'id2'=>6)));
  2. function id_recur($id1)
  3. {      
  4.     global $cat_info;
  5.         if(is_array($id1)) {
  6.                 $result = array_map('id_recur', $id1);
  7.                 //return implode('|', $result);    
  8.         }else{
  9.             if($cat_info[$id1]['sub_id'] != 0)
  10.                 $id1 .= ','.id_recur($cat_info[$id1]['sub_id']);
  11.        
  12.            return $id1;
  13.         }
  14. }
 
 Top
thesameson
Отправлено: 08 Февраля, 2013 - 11:19:37
Post Id


Новичок


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


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




Gerd пишет:
Спс, только если закомментировать строчку. От функции ничего не придет в ответ.
В чем ошибка?

Внимательней посмотрите предыдущий пост.
Помимо закомментированной строчки, исправьте $result на return
 
 Top
Stierus Супермодератор
Отправлено: 08 Февраля, 2013 - 12:26:54
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




PHP:
скопировать код в буфер обмена
  1. $cat_info = array(
  2.     3 => array("sub_id" => 2),
  3.     2 => array("sub_id" => 1),
  4.     1 => array("sub_id" => 0),
  5.     7 => array("sub_id" => 6),
  6.     6 => array("sub_id" => 5),
  7.     5 => array("sub_id" => 4),
  8.     4 => array("sub_id" => 0)
  9. );
  10.  
  11. function id_recurs()
  12. {
  13.     $numArgs = func_num_args();
  14.  
  15.     global $cat_info;
  16.  
  17.     if($numArgs ==0){
  18.         return '';
  19.     }
  20.     if($numArgs == 1){
  21.         $id = func_get_arg(0);
  22.  
  23.         if (!array_key_exists($id, $cat_info)){
  24.             return '';
  25.         }
  26.  
  27.         $childId = array_key_exists('sub_id', $cat_info[$id])?$cat_info[$id]['sub_id']:0;
  28.  
  29.         if($childId >0){
  30.             return $id.','.id_recurs($childId);
  31.         }
  32.         else{
  33.             return $id;
  34.         }
  35.     }
  36.  
  37.     $result = '';
  38.  
  39.     for($i = 0; $i<$numArgs; $i++){
  40.         $id = func_get_arg($i);
  41.         $result .= id_recurs($id);
  42.         if($numArgs != ($i+1)){
  43.             $result .= '|';
  44.         }
  45.     }
  46.     return $result;
  47. }
  48.  
  49.  
  50.  
  51.  
  52. echo id_recurs(2, 3, 7, 5, 6, 2, 0);

(Добавление)
Получается хвостовая рекурсия, но не думаю, что это сильно критично для вас
 
My status
 Top
Gerd
Отправлено: 08 Февраля, 2013 - 12:50:25
Post Id



Частый посетитель


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


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

[+][+][+]


Ого, спс за помощь всем. Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB