PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Без описания
Поиск в теме | Версия для печати
Telnet
Отправлено: 25 Июля, 2015 - 14:51:46
Частый гость
Покинул форум
Сообщений всего: 223
Дата рег-ции: Май 2011
Помог: 1 раз(а)
Всем привет.
Есть такой вот массив
представлюящий из себя дерево
PHP:
скопировать код в буфер обмена
(
[ 1 ] => 0
[ 62 ] => 0
[ 65 ] => 0
[ 8 ] => 0
[ 69 ] => 0
[ 3 ] => 0
[ 4 ] => 0
[ 5 ] => 0
[ 6 ] => 0
[ 7 ] => 0
[ 58 ] => 0
[ 87 ] => 0
[ 88 ] => 0
[ 93 ] => 0
[ 2 ] => 1
[ 78 ] => 1
[ 60 ] => 1
[ 77 ] => 1
[ 68 ] => 1
[ 24 ] => 1
[ 32 ] => 1
[ 28 ] => 2
[ 29 ] => 2
[ 79 ] => 2
[ 80 ] => 2
[ 34 ] => 2
[ 33 ] => 2
[ 39 ] => 2
[ 40 ] => 2
[ 41 ] => 3
[ 43 ] => 3
[ 44 ] => 3
[ 45 ] => 3
[ 46 ] => 3
[ 15 ] => 14
[ 16 ] => 14
[ 17 ] => 14
[ 82 ] => 34
[ 83 ] => 34
[ 84 ] => 34
[ 86 ] => 34
)
Мне его нужно обработать и получить такой массив
PHP:
скопировать код в буфер обмена
class Tmp{
static function getTmp( $tmp , $tmp2 ) {
foreach ( $tmp2 as $key => $val ) {
$tmp [ $val ] = $val ;
self :: getTmp ( $tmp , $tmp2 ) ;
}
}
return $tmp ;
}
}
1 => 0,
62 => 0,
65 => 0,
8 => 0,
69 => 0,
3 => 0,
4 => 0,
5 => 0,
6 => 0,
7 => 0,
58 => 0,
87 => 0,
88 => 0,
93 => 0,
2 => 1,
78 => 1,
60 => 1,
77 => 1,
68 => 1,
24 => 1,
32 => 1,
28 => 2,
29 => 2,
79 => 2,
80 => 2,
34 => 2,
33 => 2,
39 => 2,
40 => 2,
41 => 3,
43 => 3,
44 => 3,
45 => 3,
46 => 3,
15 => 14,
16 => 14,
17 => 14,
82 => 34,
83 => 34,
84 => 34,
86 => 34
) ;
$tmp = Tmp:: getTmp ( $tmp , $tmp2 ) ;
echo "<pre>" . print_r ( $tmp , true ) . "</pre>" ; die
( ) ;
Скрипт заканчивается тем что пишет Веб-страница недоступна ошибок в логах нет(Отредактировано автором: 25 Июля, 2015 - 14:53:42)
Сочная Долька
Отправлено: 25 Июля, 2015 - 15:33:06
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2015
Помог: 0 раз(а)
Вот ежели бы вы словесно описали, что вы делаете с деревом (из численных примеров неочевидно, а лезть в цифры немножко лень)...
Судя по всему, рекурсия ветвится потенциально бесконечно. Замечаю, что в вашем коде
* tmp2 никак не меняется, тоесть foreach при каждом новом вызове проходит один и тот же массив,
* ключ key из массива tmp не удаляется, т.е. при каждом новом вызове для одного и того же key условие в операторе if истинно, т.о. массив tmp только растёт.
Надеюсь, поможет.
Telnet
Отправлено: 25 Июля, 2015 - 16:06:39
Частый гость
Покинул форум
Сообщений всего: 223
Дата рег-ции: Май 2011
Помог: 1 раз(а)
Не много пораскинув серым веществом
понял что было не так
дело в условии in_array($key, $tmp) нужно так end($tmp) == $key)
PHP:
скопировать код в буфер обмена
<?PHP
class Tmp{
static function getTmp( $tmp , $tmp2 ) {
//echo '<br><br>';
foreach ( $tmp2 as $key => $val ) { //var_dump(end($tmp) == $key);echo '<br>';
$tmp [ $val ] = $val ; //echo "<pre>".print_r($tmp, true)."</pre>";
self :: getTmp ( $tmp , $tmp2 ) ;
}
} echo "<pre>" . print_r ( $tmp , true ) . "</pre>" ; return $tmp ;
}
}
1 => 0,
62 => 0,
65 => 0,
8 => 0,
69 => 0,
3 => 0,
4 => 0,
5 => 0,
6 => 0,
7 => 0,
58 => 0,
87 => 0,
88 => 0,
93 => 0,
2 => 1,
78 => 1,
60 => 1,
77 => 1,
68 => 1,
24 => 1,
32 => 1,
28 => 2,
29 => 2,
79 => 2,
80 => 2,
34 => 2,
33 => 2,
39 => 2,
40 => 2,
41 => 3,
43 => 3,
44 => 3,
45 => 3,
46 => 3,
15 => 14,
16 => 14,
17 => 14,
82 => 34,
83 => 34,
84 => 34,
86 => 34
) ;
$tmp = Tmp:: getTmp ( $tmp , $tmp2 ) ;
echo "<pre>" . print_r ( $tmp , true ) . "</pre>" ; die
( ) ; ?>
Теперь получаю
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)
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB