この記事は、イテレータの実装で値が false の場合に反復が完了できない原因の分析を主に紹介しています。必要な友達はそれを参照できるようになりました。 4: イテレータ実装で値が false の場合に反復が完了できない原因の分析
前回の記事にイテレータの簡単な実装と Yii フレームワークについての記事があります に簡単なイテレータの実装がありますイテレータの実装に問題が残っています。イテレーション値に false が含まれている場合、この場所でループが終了します。その理由は何でしょうか。
Brother Bird のアイデアに従って、以下に示すように、Zend/zend_vm_execute.h ファイルの 8131 行目で関連する手がかりを見つけてください。/* */ if (!iter || (iter->index > 0 && iter->funcs->valid(iter TSRMLS_CC) == FAILURE)) { /* reached end of iteration */ if (EG(exception)) { array->refcount--;zval_ptr_dtor(&array);ZEND_VM_NEXT_OPCODE();} ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);}
値が false の場合、current を通じて返される値は false で、foreach を通じてアクセスされると、トラバーサルはここで中断され、プログラムは引き続き実行されます。このループの代わりに次のコードを実行します。
解決策
配列内のキーと値を個別に処理します。valid()、rewind()、next() メソッドで value の代わりに key を操作します
current での戻り値のみ
記事内のイテレータの簡単な実装と Yii フレームワークでのイテレータの実装と Yii フレームワークでの CMapIterator の実装など
上 以上が内容ですこの記事が皆さんの学習に役立つことを願っています。その他の関連コンテンツについては、PHP 中国語 Web サイトに注目してください。
関連する推奨事項:
PHP ソース コード 23 についての簡単な説明: urlencode 関数について 概要PHP ソースコードに関するディスカッション 23 2: array_splice 関数について以上がPHP ソースコード 24 についての簡単な説明: イテレーター実装で値が false の場合に反復を完了できない理由の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。