Воспроизводимый баг в php

young

Новичок
Воспроизводимый баг в php

PHP:
<?php
$arr = array(1, 2, 3, 4, 5);
$sizeOf = sizeof($arr);
for ($i = 0; $i < $sizeOf; $i++) {
	$row =& $arr[$i];
	$row = $row * $row;
}
foreach ($arr as $row) {
echo $row."<br>";
}
?>
Output:
1
4
9
16
16
Во всех версиях php на всех ОС
Или это не баг?!
 

StUV

Rotaredom
PHP:
<?php 
$arr = array(1, 2, 3, 4, 5); 
$sizeOf = sizeof($arr); 
for ($i = 0; $i < $sizeOf; $i++) { 
    $row =& $arr[$i]; 
    $row = $row * $row; 
} 
foreach ($arr as $r) { 
echo $r."<br>"; 
} 
?>
$row -> $r в foreach
хотя действительно странно ...
 

StUV

Rotaredom
Совсем грустно:
PHP:
<?php 
$arr = array(1, 2, 3, 4, 5); 
$sizeOf = sizeof($arr); 
for ($i = 0; $i < $sizeOf; $i++) { 
    $row =& $arr[$i]; 
    $row = $row * $row; 
} 
print_r($arr);
foreach ($arr as $row){}
echo '<BR>';
print_r($arr);
?>
результат:

Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 16 )
 

KR

alive in new life
<?php
$arr = array(1, 2, 3, 4, 5);
$sizeOf = sizeof($arr);
for ($i = 0; $i < $sizeOf; $i++) {
$row =& $arr[$i];
$row = $row * $row;
}
print_r($arr);
unset($row);
foreach ($arr as $row){}
echo '<BR>';
print_r($arr);
?>

может как-то связано с локальными переменными функции?
 

StUV

Rotaredom
2KR:
видимо в процессе выполнения ($arr as $row) "что-то" происходит из-за того, что $row ссылается на $arr[4]...
(нужно смотреть исходники)
 

young

Новичок
Мне еще вчера пообщали пофиксить в 4.3.3 :)

Кстати, еще один перл..

PHP:
$arr = array(1, 2, 3, 4, 5);
$sizeOf = sizeof($arr);

for ($i = 0; $i < $sizeOf; $i++) {
  $row = &$arr[$i];
}

foreach ($arr as $row) {
  echo $row."<br>";
}
?>
 

tony2001

TeaM PHPClub
>Мне еще вчера пообщали пофиксить в 4.3.3
можешь дать ссылку на баг-репорт?
интересно что ответили.
 

young

Новичок
Еще более интересный код

<?php
$arr = array(1, 2, 3, 4, 5);
$row =& $arr[1];
foreach ($arr as $row) {
echo $row;
}
?>

11345

Это кстати, не баг а фича
Я даже понял почему :)
 

Screjet

Новичок
young, топик по "непонятному программированию" :)
PHP:
<?php 
$arr = array(1, 2, 3, 4, 5); 
$sizeOf = sizeof($arr); 
for ($i = 0; $i < $sizeOf; $i++) { 
    $row =& $arr[$i]; 
    $row = $row * $row; 
} 
//в этой точке $row - указатель на последний элемент массива
print_r($arr); 
foreach ($arr as $row){
   /*последовательно $row (указателю на последний элемент массива) присваевается каждый елемент массива. В предпоследнем цикле $row получает значение 16, а последний цикл - получает свое же значение (16)*/
} 
echo '<BR>'; 
print_r($arr); 
?>
Здесь бага нет
 

young

Новичок
Бага нет, но соль другая.

$arr[4] остается указателем на $row
Когда $row меняет свое значение $arr[4] повторяет его телодвиджение.
 

young

Новичок
Updated by: [email protected]
Reported By: young at sl dot com dot ua
-Status: Bogus
+Status: Analyzed
-Bug Type: Scripting Engine problem
+Bug Type: Documentation problem
Operating System: FreeBSD 4.7, Linux
PHP Version: 4.3.2, 4.3.3-dev, 5.0.0-dev
Assigned To: zeev
New Comment:

Make this a documentation problem..I couldn't find this explanation
there. :)
 

tony2001

TeaM PHPClub
PHP:
unset($i);
echo ++$i; // 1

unset($i);
echo --$i; // 0
не понял

>Из той же серии
>0 == "abc" // true
все верно.
для этого есть ===
 

sv2109

Новичок
young, топик по "непонятному программированию" :)
PHP:
<?php 
$arr = array(1, 2, 3, 4, 5); 
$sizeOf = sizeof($arr); 
for ($i = 0; $i < $sizeOf; $i++) { 
    $row =& $arr[$i]; 
    $row = $row * $row; 
} 
//в этой точке $row - указатель на последний элемент массива
print_r($arr); 
foreach ($arr as $row){
   /*последовательно $row (указателю на последний элемент массива) присваевается каждый елемент массива. В предпоследнем цикле $row получает значение 16, а последний цикл - получает свое же значение (16)*/
} 
echo '<BR>'; 
print_r($arr); 
?>
Здесь бага нет
Спасибо вам! :)
Вчера до 3-х ночи пытался исправить баг в коде, foreach почему-то дублировал последний элемент.. при этом print_r печатал все правильно. Совсем забыл что раньше в коде я этот массив обрабатывал с помощью указателя. unset указателя решил проблему.
 
Сверху