問題タブ [arrayiterator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - ORMクエリ結果:イテレータインターフェイスでラップされた配列と結果ハンドル
さて、これがプロのためのものです:
ここ数年、私はPork.dbObjectという名前の自分のPHP ORM/ActiveRecord実装に取り組んできました。
これは、数年前に私たち全員が見た「5分でレールを使って自分のサイトを作る」という映画に大まかに基づいています。次のようなことができます。
また
また
これにより、データベースから1つ以上の行がフェッチされ、それらがdbObjectでラップされて、1つの配列で返されるか、結果がない場合はfalseが返されます。
これらはすべて、数十のサイトとバックエンドで完全に機能していますが、現在、私の同僚はそれを使用して巨大なlogparserを作成しており、ここでメモリ使用量の問題が発生します。
彼が実行するクエリは、20.000行以上、場合によってはそれ以上を返す可能性があります。これは、もちろん、オブジェクトラッパーに一度にラップして、単一の配列として返すのはあまり良いことではありません。
明らかな解決策は、配列の代わりにIteratorインターフェースを実装するオブジェクトを返すことです。結果セットからすべてのレコードを即座にフェッチする必要はありませんが、生成されたデータベースクエリの結果リソースを保持し、オブジェクトを配列であるかのようにトラバースするときにmysql_fetch_*を内部で使用します。
今、私たちは私の本当の質問に行き着きます:私は問題なくこれをすることができますか?データベースは複数の開いている結果セットを処理し、それらを混合してしばらくの間メモリに保持することができますか?
たとえば、20個のオブジェクトをフェッチしてループし、これらの20個のオブジェクトのそれぞれに5個のオブジェクトをフェッチさせ、順番に3個のオブジェクトもフェッチします。これにより、多数の異なる結果ハンドルがメモリに保持されるループが作成されます。
これらのオブジェクトの1つをシリアル化できないことは知っていますが、PHP5で問題なくこれを実装できますか、それともデータベースインターフェイスで問題が発生しますか?
php - RecursiveArrayIterator の使用中に配列のキーと値を変更するにはどうすればよいですか?
私はここで何かばかげたことをしていると思いますが、SPL の単純な問題のように見えるものに混乱しています。
RecursiveArrayIterator / RecursiveIteratorIteratorを使用して、配列の内容 (この例の値) を変更するにはどうすればよいですか?
次のテスト コードを使用すると、 getInnerIterator()とoffsetSet( )を使用してループ内で値を変更し、ループ内で変更された配列をダンプできます。
しかし、ループを離れて反復子から配列をダンプすると、元の値に戻ります。何が起こっていますか?
php - RecursiveIteratorIterator で RecursiveArrayIterator を実装する場合の配列オブジェクト変数へのアクセス
私は次を使用してループしている大きなarrayObjectを持っています:-
配列内の特定のキーにアクセスするにはどうすればよいですか? $key と $val を echo することでそれらにアクセスできますが、アクセスしたい特定のキーがあります。$key[''] を呼び出そうとすると、キー名の最初の文字が取得されます。
編集 1
いくつかのサンプル データ (多くの異なるサブ子も存在する可能性があります):
php - PHPのArrayIterator、ArrayObject、およびArrayの違い
機能と操作の観点からArrayIterator
、ArrayObject
とPHPの基本的な違いを誰かが明確に説明できますか? Array
ありがとう!
php - すでに相互に拡張している2つのインターフェースを実装するのはなぜですか?
私はクラスについて何かArrayObject
を理解しようとしていますArrayIterator
ArrayObject
:このクラスは、IteratorAggregate
およびTraversable
インターフェイスを実装します。それ自体をIteratorAggregate
拡張するので、それがちょうど実装できるのにTraversable
、なぜ両方を実装するのですか?ArrayObject
IteratorAggregate
ArrayIterator
:上記のように、このクラスはIterator
と拡張の両方を実装Traversable
します。Iterator
これらのクラスが拡張するインターフェイスの実装を回避できるのに、なぜこれらのクラスは2つのインターフェイスを実装するのTraversable
ですか?
php - ArrayIterator の拡張と配列ストレージの変更
ArrayIterator を拡張しているときに、現在の配列にアクセスして変更するにはどうすればよいですか? またはそこから他のデータを取得しますか?
以下の例を検討してください。
OK$this->getArrayCopy()
の代わりに使用していますか????
それを行うためのより良い解決策はありますか?パフォーマンスはどうですか?
クラスの配列を動的に変更する方法は?たとえば、array_walk を使用します。
よろしく、
php - PHP、Spl、ArrayIterator
私はコードの一部を理解しようとしています:
私が理解しようとしていたのは、offSetUnsetが最初の要素ではなく配列の2番目の要素へのポインターを取得している理由です。私の理論は、次の一連のイベントです。
offSetUnsetが要素0へのポインタgoeと呼ばれると、offSetUnsetはforeachが要素を要求するまで待機し、offSetUnsetはそれが動作できることを認識します。したがって、それが発生すると、前に指定された要素が削除されます。反復が終了すると、次の要素とそれが、offSetUnsetがforeachループをリセットした後に0要素を失うと思う理由です。
しかし、私がここで尋ねる前に思いついた唯一の理論を言ったので、誰かが私を連れて行ってくれるなら、イベントシーケンスを通して私たちを0要素を失いました。ありがとうございました。良い一日を。
php - 無限ループで終わるArrayIteratorを反復処理するのはなぜですか?
私のコードの配列はかなり大きいので、pastebinに貼り付けます。http://pastebin.com/6tviT2Xj
なぜ無限のループが発生するのかわかりません
このスクリプトのロジックは次のとおりです。
php - PHP不明の多次元配列に切り替える場合
If
スイッチでこれを行う方法があるかどうかだけ興味があります
私は現在これを行っていますが、もっと良い方法があるかもしれないと思いました