問題タブ [spl]
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 - 拡張 PHP ArrayObject が正しく機能しない
SPL ArrayObject を拡張しようとしていますが、ちょっとした問題が発生しました。変更されていない ArrayObject を使用すると、次のコードが機能します。
この出力が得られます:
ただし、ArrayObject を拡張して offsetGet メソッドをオーバーロードすると、
その後、次のように失敗します。
拡張クラスを多次元配列で機能させるには何が必要ですか?
php - SPL を使用して完全なディレクトリ ツリーを取得するにはどうすればよいですか?
SPL
を使用して、場合によってはRecursiveDirectoryIterator
およびを使用して、完全なディレクトリ ツリーを取得するにはどうすればよいRecursiveIteratorIterator
ですか?
php - PHPで配列を反復処理するときは、先を見てください
PHP 5.2で配列を反復処理しながら「先読み」することは可能ですか?たとえば、配列からのデータを操作するためにforeachをよく使用します。
しかし、配列を調べている間、次の要素をのぞく必要があることがよくあります。for
ループを使用して、インデックス()で次の項目を参照できることはわかっています$array[$i+1]
が、連想配列では機能しません。おそらくSPLを含む、私の問題に対するエレガントな解決策はありますか?
php - なぜ IteratorIterator を巻き戻す必要があるのか
最初に$iterIter->rewind()を呼び出すと、$iterIter->valid()は true になります。rewind() を呼び出す必要がある理由が気になります。それには正当な理由があると思いますが、内部イテレータの状態が何であれ、単純に反復を開始し、反復を開始する前に巻き戻すオプションとしてそのままにしておくことを期待していました。
next() を呼び出すと、それが「有効な」状態になるようにも見えます (ただし、以前は最初の位置にあったことを示唆して、次の位置に進みます)。
繰り返しますが、内部イテレータが有効な状態にあるにもかかわらず、rewind() を呼び出す必要があるのはなぜでしょうか。
php - カスタムFileInfoクラスをイテレータに設定する正しい方法
setInfoClass
次のメソッドを使用して、カスタムクラスをイテレータに設定しようとしています。
このメソッドを使用して、getFileInfoおよびgetPathInfoが呼び出されたときに使用されるカスタムクラスを設定します。このメソッドに渡されるクラス名は、SplFileInfoから派生している必要があります。
私のクラスは次のようなものです(簡略化した例):
イテレータコードは次のとおりです。
はオブジェクトもRecursiveDirectoryIterator
継承するため、メソッドを提供します。マニュアルには記載されていませんが、リフレクションはそこにあることを示しています。DirectoryIterator
SplFileInfo
setInfoClass
ここまではすべて問題ありませんが、ディレクトリを反復処理する場合は
次の奇妙な結果が得られます
MyFileInfo
そのため、ピックアップされている間は、そのプロパティにアクセスできません。カスタムメソッドを追加すると、それらを正常に呼び出すことができますが、プロパティは不明です。
infoクラスをイテレータに設定せずにSplFileInfoオブジェクト(マニュアルの例に示されているように)に設定すると、同じUNKNOWN結果が得られます。
しかし、私がやるとそれは動作します
残念ながら、これを使用したいコードはやや複雑で、さらにいくつかのイテレーターをスタックします。このようにMyFileInfoクラスを作成することはオプションではありません。
それで、これを機能させる方法や、PHPがこれを奇妙に動作させる理由を誰かが知っていますか?
ありがとう。
php - PHP SPLライブラリのソースコードはどこにありますか?
で定義ファイルを見つけることができますが、実際のファイルシステムではなくデータベースに保存されている仮想ファイルシステムを拡張して操作しhttp://www.php.net/~helly/php/ext/spl/...
たいと思います。DirectoryIterator
SplFileInfo
php - PHPのSPLを使用して隣接リストから結果を集約するにはどうすればよいですか
ネストされたセットを使用してみましたが、複数のツリーやその他の多くの問題を処理するときに、それらを維持するのが非常に困難になります。PHPのSPLライブラリにこれを試してみたいと思います(ところで、PHP 5.3、MySQL 5.1 )。
与えられた2つのデータセット:
グループ:
アイテム
数字は実際にはこれよりもはるかに複雑です(私は実際には過去15年間の月または年の変動量を集計しているため、集計結果の20列が必要になる場合があります)。
編集: @Gordon結果セットを取得するには、いくつかの方法があると思います。理想的には、RecursiveIteratorのものを使用して、すべてのビジネスロジック(リーフノードなど)はすでに実行されているため、結果は次のようになります(隣接リストの深さは任意であることに注意してください)。
:編集終了
私はRecursiveIteratorとIteratorAggregateを理解しようとしてきましたが、これらのクラスに頭を悩ませるほど一般的な実例を見つけるのに苦労しています。
誰かが私に有利なスタートを切ることができますか?
編集:
ここでは、非常に詳細なソリューションは必要ありません。階層データを集約するためのクリーンでスケーラブルなソリューションを考え出すために、Iterator、RecursiveIterator、RecursiveIteratorIteratorなどをどこで利用できるかは不明です。
:編集終了
php - RecursiveParentChildIterator-RecursiveDirectoryIteratorのような
RecursiveIteratorを使用してツリー構造を平坦化する例はたくさんありますが、それを使用してツリー構造を分解するのはどうでしょうか。
これを使用するエレガントな方法、または他のSPLライブラリを使用して、次のようなテーブルを指定してツリーを再帰的に構築する方法はありますか(読み取り:フラット配列を任意の深さの配列に変換します)。
編集: ディレクトリでこれを行う方法を知っていますか?
..あなたがこのようなことをすることができたらどうしますか:
:編集終了
php - オブジェクトを反復処理するときの PHP 5.1.6 ArrayAccess エラー
PHP 5.1.6 でサイトを開発する必要があり、サイトで 5.2 以降では発生しないバグに遭遇しました。foreach() を使用してオブジェクトを反復処理すると、次のエラーが発生します。
この問題を回避する方法を知っている人はいますか?