array pointer глюк или фича?

rudik

Developer
array pointer глюк или фича?

Если не сложно проверьте следующий код на своих серверах:

PHP:
function test () {
	$array = array(1,2,3,4,5,6);
	next($array);
	next($array);
	return $array;
}
$x = test();
// $y = $x;
echo current($x);
И второй раз раскоментируйте строку. // $y = $x

В первом варианте оно выводит 2, а во втором - 1. Хотя переменная $x - не меняется.

Fedora Core 1.0, Apache 1.3.29, PHP 4.3.5 (xdebug 1.31)
 

xlex

Guest
PHP version: 4.3.2 (ZDE)
Первый раз: 3
Второй раз: 1
По-моему, всё нормально: первый раз имеем два смещения, второй раз имеем reset() при присвоении новой переменной...
 

trigger

Guest
Кто-нибудь знает, где в мануале говорится про reset() в присвоении? Я не могу найти.

Скорее всего массив копируется, используя вещи наподобие foreach(). Кто-нить смотрел это в исходниках?

PS:
PHP:
$z = &$x;
$y = $z;
unset($z);
-~{}~ 02.05.04 10:25:

Упс...
PHP:
$x = test();
$z = &$x;
$y = $x;
echo current($x);
Выводит 3.
 

valyala

Новичок
корее всего массив копируется, используя вещи наподобие foreach(). Кто-нить смотрел это в исходниках?
Массив копируется только при изменении. Это легко проверить на следующем примере:
PHP:
function getmicrotime() { 
    list($usec, $sec) = explode(' ', microtime());
    return (float) $usec + (float) $sec;
}

$a = array();

$t = getmicrotime();
for ($i = 0; $i < 1e5; $i++) $a[] = $i;
printf('Time to create array: %.6f<br>', getmicrotime() - $t);

$t = getmicrotime();
$b = $a;
printf('Time to copy array: %.6f<br>', getmicrotime() - $t);

$t = getmicrotime();
$b[0] = 1;
printf('Time to first change array: %.6f<br>', getmicrotime() - $t);

$t = getmicrotime();
$b[1] = 2;
printf('Time to second change array: %.6f<br>', getmicrotime() - $t);
 

rudik

Developer
Получается PHP сбрасывает array pointer в условно скопированном массиве и тем самым reset происходит и в изначальном массиве, так как они до изменения являются одинаковыми.

-~{}~ 08.05.04 15:26:

Добавил информацию об объеме памяти, который занимает скрипт после каждой операции:

Time to create array: 0.888485
6 165 592
Time to copy array: 0.000176
6 165 632
Time to first change array: 0.171360
10 690 000
Time to second change array: 0.000179
10 690 016

Вывод: PHP создает ссылки при копировании массива на изначальный массив и сбрасывает в нем array pointer, а после изменения копирует сам массив.
 
Сверху