PDA

Просмотр полной версии : Странное зацикливание


AleXNoD GD
14.10.2007, 08:02
Вот скажите мне, почему

<?
$arr = Array();
$out = Array();
for($i=0;$i<100;$i++){
$arr[]=$i;
}
foreach($arr as $k=>$v){
$out[$k]++;
}
?>

работает исправно, а

<?
$arr = Array();
$out = Array();
for($i=0;$i<1000;$i++){
$arr[]=$i;
}
foreach($arr as $k=>$v){
$out[$k]++;
}
?>

подвешивает мне браузер :umnik2: ? В чем проблема то?

Добавлю, что если "++" заменить на "= 1", то есть не увеличивать значение, то всё отлично. Проблема именно с "++".

AleXNoD GD
14.10.2007, 23:30
Загадка не для оного ума...

Skubent
15.10.2007, 00:18
Осталось сообразить, что инкремент неопределенного значения на единицу может повесить что угодно, а не только локальный браузер...

AleXNoD GD
15.10.2007, 02:14
Где ошибка? - в ДНК))))
А если серьезно, можно ли как-то обойти проблему? Этот код чисто показательный, а вообще необходимо расставить "веса" ключей при помощи инкремента. Но тут такая вот хренотень.

Kikasso
15.10.2007, 02:26
Что значит чисто показательный? У вас второй массив пустой, а вы там что-то плюсуете.

Skubent
15.10.2007, 03:34
Буратино дали два яблока. Он отдал одно Мальвине. Сколько яблок осталось у Буратины ? Правильно, хз. Мораль - инициализируйте переменные.

etc
15.10.2007, 10:30
AleXNoD GD, а внимательно на свой код посмотреть?
Заполняется массив arr, а плюсуются значения у out, который пуст. Неудивительно, что ничего не работает.

AleXNoD GD
16.10.2007, 21:10
Всё ясно, спасибо большое за красочные ответы. Просто меня смутил тот факт, что

<?
$arr = Array();
$out = Array();
for($i=0;$i<1000;$i++){
$arr[]=$i;
}
foreach($arr as $k=>$v){
if(!$out[$k]){
$out[$k] = 1;
}else{
$out[$k]++;
}
}
?>
НЕ работает

<?
$arr = Array();
$out = Array();
for($i=0;$i<1000;$i++){
$arr[]=$i;
$out[]=0;
}
foreach($arr as $k=>$v){
$out[$k]++;
}
?>
работает

Теперь всё в порядке. Вы сделали вклад в создание совершенного искусственного интеллекта)))

Skubent
16.10.2007, 21:50
>>Вы сделали вклад в создание совершенного искусственного интеллекта
Чур меня...

if(!$out[$k]){
$out[$k] = 1;
}else{
$out[$k]++;
}

Не работает почему ? Потому что операция НЕ в условии применяется к неопределенному значению.
isset() - более правильный вариант проверки переменной на наличие значения.

Кроме того, что мешает просто заполнить весь $out единицами ?

AleXNoD GD
16.10.2007, 22:04
Кроме того, что мешает просто заполнить весь $out единицами ?
Мешает неопределенность. Массив будет заполняться на лету.

По поводу isset - да, тут я ступил.

Skubent
17.10.2007, 10:30
Синтетические примеры - в общем случае - зло. Хотя правильно составленная синтетика - большой плюс, да.