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 オブジェクトと呼ぶことができます。












![PHP 実践開発入門: PHP クイック作成 [中小企業フォーラム]](https://img.php.cn/upload/course/000/000/035/5d27fb58823dc974.jpg)









