foreach 変更



1. foreach() ループは、配列の内部ポインターに対して機能しなくなりました。

$array = [0, 1, 2];
foreach ($array as &$val) 
{
    var_dump(current($array));
}
PHP7 は結果として int(0) を 3 回出力します。これは、配列の内部ポインタが変更されていないことを意味します。

前の操作の結果は、int(1)、int(2)、および bool(false) を出力します。

2. 値に従ってループする場合、foreach は配列のコピー操作です

foreach が値 (値ごと) でループする場合、foreach は配列のコピーを操作します。この方法では、ループ中に配列を変更しても、ループの動作には影響しません。
$array = [0, 1, 2];
$ref =& $array; // Necessary to trigger the old behavior
foreach ($array as $val) {
    var_dump($val);
    unset($array[1]);
}
上記のコードはループ内の配列の 2 番目の要素の設定を解除しますが、PHP7 は引き続き 3 つの要素を出力します: (0 1 2)

以前のバージョンの PHP では、 1 をスキップし、(0 2) のみを出力します。 .

3. 参照に従ってループする場合、配列への変更はループに影響します。

ループ時に参照を使用する場合、配列への変更はループの動作に影響します。ただし、PHP7 バージョンでは、多くのシナリオで場所のメンテナンスが最適化されます。たとえば、ループ中に要素を配列に追加します。

$array = [0];
foreach ($array as &$val) {
    var_dump($val);
    $array[1] = 1;
}

上記のコードに追加された要素もループに参加するため、PHP7 では「int(0) int(1)」が出力され、古いバージョンでは「int(0)」のみが出力されます。

4. 単純なオブジェクトをプレーンにループします (走査不可能)。

単純なオブジェクトのループは、値によるループでも参照によるループでも、配列内の参照によるループと同じように動作します。ただし、位置管理はより正確になります。

5. Traversable オブジェクトのオブジェクトの動作は以前と同じです。

編集者注: 上記の stackoverflow の説明: Traversable オブジェクトは、Iterator または IteratorAggregate インターフェイスを実装するオブジェクトです。オブジェクトが iterator または IteratorAggregate インターフェイスを実装している場合、それを iterator オブジェクトと呼ぶことができます。