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]   

> Без описания
Telnet
Отправлено: 25 Июля, 2015 - 14:51:46
Post Id


Частый гость


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


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




Всем привет.
Есть такой вот массив
представлюящий из себя дерево
PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [1] => 0
  4.     [62] => 0
  5.     [65] => 0
  6.     [8] => 0
  7.     [69] => 0
  8.     [3] => 0
  9.     [4] => 0
  10.     [5] => 0
  11.     [6] => 0
  12.     [7] => 0
  13.     [58] => 0
  14.     [87] => 0
  15.     [88] => 0
  16.     [93] => 0
  17.     [2] => 1
  18.     [78] => 1
  19.     [60] => 1
  20.     [77] => 1
  21.     [68] => 1
  22.     [24] => 1
  23.     [32] => 1
  24.     [28] => 2
  25.     [29] => 2
  26.     [79] => 2
  27.     [80] => 2
  28.     [34] => 2
  29.     [33] => 2
  30.     [39] => 2
  31.     [40] => 2
  32.     [41] => 3
  33.     [43] => 3
  34.     [44] => 3
  35.     [45] => 3
  36.     [46] => 3
  37.     [15] => 14
  38.     [16] => 14
  39.     [17] => 14
  40.     [82] => 34
  41.     [83] => 34
  42.     [84] => 34
  43.     [86] => 34
  44. )
  45.  

Мне его нужно обработать и получить такой массив
PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [86] => 86
  4.     [34] => 34
  5.     [2] => 2
  6.     [1] => 1
  7. )
  8.  

PHP:
скопировать код в буфер обмена
  1.  
  2. class Tmp{
  3.         static function getTmp( $tmp, $tmp2 ){
  4.                 foreach($tmp2 as $key=>$val){
  5.                         if( !empty($key)  && !empty($val) && in_array($key, $tmp)){
  6.                                 $tmp[ $val ] = $val;
  7.                                 self::getTmp($tmp, $tmp2 );
  8.                         }
  9.                 }
  10.                 return  $tmp;  
  11.         }
  12. }
  13. $tmp = array(86=>86);
  14. $tmp2 = array(
  15.     1 => 0,
  16.     62 => 0,
  17.     65 => 0,
  18.     8 => 0,
  19.     69 => 0,
  20.     3 => 0,
  21.     4 => 0,
  22.     5 => 0,
  23.     6 => 0,
  24.     7 => 0,
  25.     58 => 0,
  26.     87 => 0,
  27.     88 => 0,
  28.     93 => 0,
  29.     2 => 1,
  30.     78 => 1,
  31.     60 => 1,
  32.     77 => 1,
  33.     68 => 1,
  34.     24 => 1,
  35.     32 => 1,
  36.     28 => 2,
  37.     29 => 2,
  38.     79 => 2,
  39.     80 => 2,
  40.     34 => 2,
  41.     33 => 2,
  42.     39 => 2,
  43.     40 => 2,
  44.     41 => 3,
  45.     43 => 3,
  46.     44 => 3,
  47.     45 => 3,
  48.     46 => 3,
  49.     15 => 14,
  50.     16 => 14,
  51.     17 => 14,
  52.     82 => 34,
  53.     83 => 34,
  54.     84 => 34,
  55.     86 => 34
  56. );
  57. $tmp = Tmp::getTmp( $tmp, $tmp2 );
  58. echo "<pre>".print_r($tmp , true)."</pre>";die();
  59.  


Скрипт заканчивается тем что пишет Веб-страница недоступна ошибок в логах нет

(Отредактировано автором: 25 Июля, 2015 - 14:53:42)

 
 Top
Сочная Долька
Отправлено: 25 Июля, 2015 - 15:33:06
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2015  


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




Вот ежели бы вы словесно описали, что вы делаете с деревом (из численных примеров неочевидно, а лезть в цифры немножко лень)...

Судя по всему, рекурсия ветвится потенциально бесконечно. Замечаю, что в вашем коде
* tmp2 никак не меняется, тоесть foreach при каждом новом вызове проходит один и тот же массив,
* ключ key из массива tmp не удаляется, т.е. при каждом новом вызове для одного и того же key условие в операторе if истинно, т.о. массив tmp только растёт.

Надеюсь, поможет.
 
 Top
Telnet
Отправлено: 25 Июля, 2015 - 16:06:39
Post Id


Частый гость


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


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




Не много пораскинув серым веществом
понял что было не так
дело в условии in_array($key, $tmp) нужно так end($tmp) == $key)
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class Tmp{
  4.         static function getTmp( $tmp, $tmp2 ){
  5.                 //echo  '<br><br>';
  6.                 foreach($tmp2 as $key=>$val){//var_dump(end($tmp) == $key);echo '<br>';
  7.                         if( !empty($key)  && !empty($val) && end($tmp) == $key){
  8.                                 $tmp[ $val ] = $val;//echo "<pre>".print_r($tmp, true)."</pre>";
  9.                                 self::getTmp($tmp, $tmp2 );
  10.                         }
  11.                 }echo "<pre>".print_r($tmp, true)."</pre>";
  12.                 return  $tmp;  
  13.         }
  14. }
  15. $tmp = array(86=>86);
  16. $tmp2 = array(
  17.     1 => 0,
  18.     62 => 0,
  19.     65 => 0,
  20.     8 => 0,
  21.     69 => 0,
  22.     3 => 0,
  23.     4 => 0,
  24.     5 => 0,
  25.     6 => 0,
  26.     7 => 0,
  27.     58 => 0,
  28.     87 => 0,
  29.     88 => 0,
  30.     93 => 0,
  31.     2 => 1,
  32.     78 => 1,
  33.     60 => 1,
  34.     77 => 1,
  35.     68 => 1,
  36.     24 => 1,
  37.     32 => 1,
  38.     28 => 2,
  39.     29 => 2,
  40.     79 => 2,
  41.     80 => 2,
  42.     34 => 2,
  43.     33 => 2,
  44.     39 => 2,
  45.     40 => 2,
  46.     41 => 3,
  47.     43 => 3,
  48.     44 => 3,
  49.     45 => 3,
  50.     46 => 3,
  51.     15 => 14,
  52.     16 => 14,
  53.     17 => 14,
  54.     82 => 34,
  55.     83 => 34,
  56.     84 => 34,
  57.     86 => 34
  58. );
  59. $tmp = Tmp::getTmp( $tmp, $tmp2 );
  60. echo "<pre>".print_r($tmp , true)."</pre>";die();
  61. ?>
  62.  

Теперь получаю
Array
(
[86] => 86
[34] => 34
[2] => 2
[1] => 1
)
Array
(
[86] => 86
[34] => 34
[2] => 2
[1] => 1
)
Array
(
[86] => 86
[34] => 34
[2] => 2
)
Array
(
[86] => 86
[34] => 34
)
В конце
Array
(
[86] => 86
[34] => 34
)
а мне нужно что б возвращало
Array
(
[86] => 86
[34] => 34
[2] => 2
[1] => 1
)
т.е то что получается в конце, в самом вложеном вызове функции getTmp
(Добавление)
Разобрался
нужно было присваивать результат в рекурсии
$tmp = self::getTmp($tmp, $tmp2 );

(Отредактировано автором: 25 Июля, 2015 - 16:07:35)

 
 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