小编use*_*ite的帖子

PHP 7更改为foreach:我是否仍然可以删除我正在迭代的数组中的项目?

PHP 7向后兼容的改变文件说,有关的foreach如下:

在默认的按值模式下使用时,foreach现在将对正在迭代的数组的副本进行操作,而不是对数组本身进行操作.这意味着在迭代期间对数组所做的更改不会影响迭代的值.

我试图理解这意味着什么,我的主要问题是这个代码在PHP 7中是否与PHP 5.6中的相同?

foreach($array as $elementKey => $element) {
    if ($element == 'x') {
        unset($array[$elementKey]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的两个问题是:

  1. 这段代码还能用吗?

  2. 如果是这样,你能解释一下(可能通过例子)PHP 7中的这一新变化意味着什么吗?

编辑

我一直在重读这份文件声明.我认为这意味着,如果您更改数组中较低项的值,那么当您在迭代中找到这些项时,这些更改将不会存在.例:

$array = ['x', 'y', 'z'];

$new = [];

foreach($array as $element) {
    if ($element == 'x') {
        $array[2] = 'a';
    }

    $new[] = $element;
}

print_r($new);
Run Code Online (Sandbox Code Playgroud)

但是,当我运行这个例子时,它似乎没有显示PHP版本的任何差异(虽然我以前从未使用过这个工具,所以我不确定它是如何工作的).

我意识到,如果我通过参考来做,我会得到一个a新的.否则我不会.但这两个版本似乎都是这种情况.

我真正需要知道的是什么是不兼容性(例如)?

编辑2

@NikiC 建议答案链接提供了我正在寻找的故事的其余部分:

在大多数情况下,这种变化是透明的,除了更好的性能外没有其他影响.但是有一种情况会导致不同的行为,即数组事先是参考的情况:

$array = [1, 2, 3, 4, 5]; …
Run Code Online (Sandbox Code Playgroud)

php php-7

26
推荐指数
1
解决办法
1万
查看次数

标签 统计

php ×1

php-7 ×1