問題タブ [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.

0 投票する
1 に答える
1086 参照

php - ORMクエリ結果:イテレータインターフェイスでラップされた配列と結果ハンドル

さて、これがプロのためのものです:

ここ数年、私はPork.dbObjectという名前の自分のPHP ORM/ActiveRecord実装に取り​​組んできました。

これは、数年前に私たち全員が見た「5分でレールを使って自分のサイトを作る」という映画に大まかに基づいています。次のようなことができます。

また

また

これにより、データベースから1つ以上の行がフェッチされ、それらがdbObjectでラップされて、1つの配列で返されるか、結果がない場合はfalseが返されます。

これらはすべて、数十のサイトとバックエンドで完全に機能していますが、現在、私の同僚はそれを使用して巨大なlogparserを作成しており、ここでメモリ使用量の問題が発生します。

彼が実行するクエリは、20.000行以上、場合によってはそれ以上を返す可能性があります。これは、もちろん、オブジェクトラッパーに一度にラップして、単一の配列として返すのはあまり良いことではありません。

明らかな解決策は、配列の代わりにIteratorインターフェースを実装するオブジェクトを返すことです。結果セットからすべてのレコードを即座にフェッチする必要はありませんが、生成されたデータベースクエリの結果リソースを保持し、オブジェクトを配列であるかのようにトラバースするときにmysql_fetch_*を内部で使用します。

今、私たちは私の本当の質問に行き着きます:私は問題なくこれをすることができますか?データベースは複数の開いている結果セットを処理し、それらを混合してしばらくの間メモリに保持することができますか?

たとえば、20個のオブジェクトをフェッチしてループし、これらの20個のオブジェクトのそれぞれに5個のオブジェクトをフェッチさせ、順番に3個のオブジェクトもフェッチします。これにより、多数の異なる結果ハンドルがメモリに保持されるループが作成されます。

これらのオブジェクトの1つをシリアル化できないことは知っていますが、PHP5で問題なくこれを実装できますか、それともデータベースインターフェイスで問題が発生しますか?

0 投票する
7 に答える
5885 参照

php - RecursiveArrayIterator の使用中に配列のキーと値を変更するにはどうすればよいですか?

私はここで何かばかげたことをしていると思いますが、SPL の単純な問題のように見えるものに混乱しています。

RecursiveArrayIterator / RecursiveIteratorIteratorを使用して、配列の内容 (この例の値) を変更するにはどうすればよいですか?

次のテスト コードを使用すると、 getInnerIterator()offsetSet( )を使用してループ内で値を変更し、ループ内で変更された配列をダンプできます。

しかし、ループを離れて反復子から配列をダンプすると、元の値に戻ります。何が起こっていますか?

0 投票する
2 に答える
1042 参照

php - RecursiveIteratorIterator で RecursiveArrayIterator を実装する場合の配列オブジェクト変数へのアクセス

私は次を使用してループしている大きなarrayObjectを持っています:-

配列内の特定のキーにアクセスするにはどうすればよいですか? $key と $val を echo することでそれらにアクセスできますが、アクセスしたい特定のキーがあります。$key[''] を呼び出そうとすると、キー名の最初の文字が取得されます。

編集 1

いくつかのサンプル データ (多くの異なるサブ子も存在する可能性があります):

0 投票する
5 に答える
3533 参照

c++ - イテレータは配列[i]より速いですか?

重複の可能性:
配列インデックスの代わりに反復子を使用するのはなぜですか?

私の人生では、なぜそれらが冗長でないのか理解できないからです。

多分彼らは速いですか?

0 投票する
7 に答える
20980 参照

php - PHPのArrayIterator、ArrayObject、およびArrayの違い

機能と操作の観点からArrayIteratorArrayObjectとPHPの基本的な違いを誰かが明確に説明できますか? Arrayありがとう!

0 投票する
1 に答える
354 参照

php - すでに相互に拡張している2つのインターフェースを実装するのはなぜですか?

私はクラスについて何かArrayObjectを理解しようとしていますArrayIterator

ArrayObject:このクラスは、IteratorAggregateおよびTraversableインターフェイスを実装します。それ自体をIteratorAggregate拡張するので、それがちょうど実装できるのにTraversable、なぜ両方を実装するのですか?ArrayObjectIteratorAggregate

ArrayIterator:上記のように、このクラスはIteratorと拡張の両方を実装Traversableします。Iterator

これらのクラスが拡張するインターフェイスの実装を回避できるのに、なぜこれらのクラスは2つのインターフェイスを実装するのTraversableですか?

0 投票する
1 に答える
1906 参照

php - ArrayIterator の拡張と配列ストレージの変更

ArrayIterator を拡張しているときに、現在の配列にアクセスして変更するにはどうすればよいですか? またはそこから他のデータを取得しますか?

以下の例を検討してください。

OK$this->getArrayCopy()の代わりに使用していますか????それを行うためのより良い解決策はありますか?パフォーマンスはどうですか?

クラスの配列を動的に変更する方法は?たとえば、array_walk を使用します。

よろしく、

0 投票する
2 に答える
860 参照

php - PHP、Spl、ArrayIterator

私はコードの一部を理解しようとしています:

私が理解しようとしていたのは、offSetUnsetが最初の要素ではなく配列の2番目の要素へのポインターを取得している理由です。私の理論は、次の一連のイベントです。

offSetUnsetが要素0へのポインタgoeと呼ばれると、offSetUnsetはforeachが要素を要求するまで待機し、offSetUnsetはそれが動作できることを認識します。したがって、それが発生すると、前に指定された要素が削除されます。反復が終了すると、次の要素とそれが、offSetUnsetがforeachループをリセットした後に0要素を失うと思う理由です。

しかし、私がここで尋ねる前に思いついた唯一の理論を言ったので、誰かが私を連れて行ってくれるなら、イベントシーケンスを通して私たちを0要素を失いました。ありがとうございました。良い一日を。

0 投票する
4 に答える
690 参照

php - 無限ループで終わるArrayIteratorを反復処理するのはなぜですか?

私のコードの配列はかなり大きいので、pastebinに貼り付けます。http://pastebin.com/6tviT2Xj

なぜ無限のループが発生するのかわかりません

このスクリプトのロジックは次のとおりです。

0 投票する
2 に答える
106 参照

php - PHP不明の多次元配列に切り替える場合

Ifスイッチでこれを行う方法があるかどうかだけ興味があります

私は現在これを行っていますが、もっと良い方法があるかもしれないと思いました