PHP の 'foreach' ループを理解する
'foreach' は 3 種類の値の反復をサポートしています:
配列とオブジェクトの反復
配列とオブジェクトは、順序付けされた辞書として走査されます。プレーン オブジェクトの走査は、内部で順序付けされた辞書として表現されるため、配列の走査と似ています。
反復中の内部変更
- 参照配列の反復または反復オブジェクト (ハンドル セマンティクスによる) により、ループ内での変更が可能になります。反復。
- 参照カウントが 1 より大きい配列を反復すると、変更前の配列が複製される可能性があります。
PHP 5 アプローチ
- 位置を追跡するために内部配列ポインター (IAP) を使用します。
- 追加HashPointer を採用して、複数の同時 'foreach' ループをサポートします。
- 参照カウントが 1 より大きく、配列が参照ではない場合、配列の重複が発生します。
- IAP の進歩は 前に発生します ループ本体が実行されます。
PHP 7アプローチ
- IAP の使用を完全に放棄します。
- 反復中の変更を処理するために配列に登録されたハッシュテーブル反復子を導入します。
- 値による配列の重複配列の反復は、ループ中に配列が変更された場合にのみ発生します。
- 'foreach' の動作は次のとおりです。 「current()」または「reset()」の影響を受けなくなりました。
ご質問への回答
1.これは正しいですか?
「foreach」は配列のコピーを操作しますが、配列ポインターに影響を与えるという理解は正しいです。ただし、PHP 7 では、「foreach」は IAP を使用せず、代わりにハッシュテーブル イテレーターに依存するため、より一貫性があり、予測可能な動作になります。
2.実際には何をしているのでしょうか?
- PHP 5: IAP と HashPointer の組み合わせを使用して反復をサポートしますが、場合によっては重複や予期しない動作が発生する可能性があります。
- PHP 7: 「foreach」ループの影響を受けず、実行中の変更を適切に処理するハッシュテーブル反復子を採用します。反復。
3. 「foreach」中に配列ポインターを調整する関数を使用すると、ループの結果に影響を与える可能性がある状況はありますか?
-
PHP 5: 'each()' と 'reset()' は、ネストされた 'foreach' ループの動作に影響を与える可能性があり、ハッシュの衝突により予期しない動作が発生する可能性もあります。
-
PHP 7: 配列ポインターを調整する関数は、'foreach' の動作には影響しません。 IAP に依存します。
以上がPHP の「foreach」ループは PHP 5 および PHP 7 でどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。