че-то я не понимаю FOREACH ($array as &$k)

DiMA

php.spb.ru
Команда форума
че-то я не понимаю FOREACH ($array as &$k)

PHP:
<?
$a = array(1,2,3);
foreach ($a as &$val) {}
//unset($val);
var_dump($a);
?>
Ну, с $val - все понятно.

А почему оригинальный массив искажается?

И почему на пхп 5.1.6 под виндой вардамп выдает
Код:
array(3) {
  [0]=>
  &int(1)
  [1]=>
  &int(2)
  [2]=>
  &int(3)
}
а на пхп 5.3.RC3 под фрей - иное?
Код:
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(3)
}
 

Армян

Новичок
Есть такая фигня, сталкивался - тоже не понял почему так, забил и теперь & в форыче не пользуюсь, только ключами =)

Под юнихом пхп версии 5.1.*, тоже выдавал 2ой вариант
 

zerkms

TDD infected
Команда форума
где что искажается? у 5.3 (а также 5.2) поведение ожидаемое и правильное.
 

zerkms

TDD infected
Команда форума
Армян
и это совершенно ожидаемый результат. разве нет?
 

Макс

Старожил PHPClub
Судя по всему var_dump() научился выдавать доп. информацию для массива - в частности то, есть ли на его элементы ссылки
После отработки foreach ($a as &$val) {} на последний элемент массива ссылается переменная $val, о чем и говорит var_dump()

-~{}~ 05.08.09 10:27:

то есть
PHP:
array(3) { 
  [0]=> 
  int(1) 
  [1]=> 
  int(2) 
  [2]=> 
  &int(3) 
}
вполне ожидаемый результат
 

SiMM

Новичок
> в частности то, есть ли на его элементы ссылки
А как предлагаете отличать вариант
PHP:
$a = array(1); 
$val = &$a[0];
var_dump($a);
от варианта
PHP:
$val = 1;
$a = array(1); 
$a[0] = &$val;
var_dump($a);
Всегда полагал, что амперсанд рисуется в var_damp'е только во втором случае.
 

Макс

Старожил PHPClub
никак
ссылки в ПХП - это ссылки на _значение_, а не на переменную.
то есть строка типа
PHP:
$val = &$a[0];
не значит что $val указывает на $a[0].
Она означает что $a[0] и $val указывают на одну область памяти.
Ближайший аналог - hardlinks в unix-ах
 

zerkms

TDD infected
Команда форума
Alexandre
и чем же он ожидаем? ожидаемый результат:
неправильно. двойка.
после выхода из цикла $val содержит значение последнего элемента. а &$val - ссылку на значение последнего элемента.
 

zerkms

TDD infected
Команда форума
DiMA
давай ещё приведи результат выполнения в пхп3.
 

zerkms

TDD infected
Команда форума
DiMA
если тебе кажется это багом - запости в багтреккер пхп и получи официальный посыл обновить версию.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
мешает писать обработку массивов для всех PHP > 5
 

dimagolov

Новичок
а зачем писать
PHP:
 foreach ($arr as &$v)
   // do something with $v
когда можно делать
PHP:
foreach ($arr as $i => $v)
  // do something with $arr[$i]
?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
dimagolov прав, кстати. Работа напрямую с нужным массивом, опираясь на индекс, куда более надежный и аккуратный вариант, чем педерача текущего элемента по ссылке.
 

dimagolov

Новичок
Сверху