PHP 7.0.0 Beta 1 Released

hell0w0rd

Продвинутый новичок
Похоже я не понимаю что хотели сказать этой фразой
PHP:
<?php
$arr = [1, 2, 3];
foreach ($arr as $i => $value) {
  array_splice($arr, 0, 1, [0, 0]);
  var_dump($value);
}
Видимо foreach работает с копией массива, тк пример не работает, как я ожидал.
В общем суть в том, что можно работать с коллекцией, если итерация идет по другой коллекции, на пример по копии первой. Иначе есть риск получить UB, в частности попасть в бесконечный цикл. Все очень зависит от конкретного языка, компилятора и тп.

ЗЫ
Вот тебе код, вешающий хром:
PHP:
for (var i = 0; i < arr.length; i++) {
  arr.push(i + 1);
  console.log(i);
}
 

HORO

Новичок
да не обязательно копии.
PHP:
for (var i = 0,c=arr.length; i < c; i++) {
  arr.push(i + 1);
  console.log(i);
}
foreach вроде так же работает сейчас
PHP:
<?php
$arr=array(0);
foreach($arr as $k=>$v){
    $arr[]=$v+1;
}
print_r($arr);
// $arr - 0,1
и не с копией
PHP:
<?php
$arr=array(0);
foreach($arr as $k=>&$v){
    $v=1;
}
print_r($arr);
// $arr - 1
 
Последнее редактирование:

Absinthe

жожо
А я думал, что это должны пофиксить:

PHP:
$a = range(1, 10);

foreach ($a as &$v) {
  $v++;
}

foreach ($a as $v) {
  $v++;
}

var_dump($a);
Но не исправили, жаль.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
господа, еще раз для тех ...
статью в #post-728577 перечитайте, там подробно объяснили, что
у foreach ($a as &$v) и у foreach ($a as $v) совершенно разный механизм реализации.
для &$v создается отдельный zval-объект типа указатель, и до unset никуда он не денется, $v останется указателем,

в 5ке механизм другой, там идет копирование массива в памяти, а $v становися алиасом у элемента массива
 
Последнее редактирование:
  • Like
Реакции: HORO

HORO

Новичок
Понятно, тоесть вот этот код будет работать как раньше
PHP:
<?php
$array = array(0, 1, 2);
foreach ($array as &$val) {
    var_dump($val);
    unset($array[1]);
}
а вот этот теперь приведет к зацикливанию
PHP:
<?php
$array = array(0);
foreach ($array as &$val) {
    $array[]=$val+1;
}
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да, это бесконечный цикл
$ php -r 'foreach ($array=[0] as &$val) $array[]=$val+1;'
Fatal error: Allowed memory size of 33554432 bytes exhausted at /usr/src/web/php-7.0.0alpha2/Zend/zend_hash.c:176 (tried to allocate 16777224 bytes) in Command line code on line 1
 
Последнее редактирование:
Сверху