質問

ArrayAccess を実装するオブジェクトがあります。 イテレーターおよび Countable 。これにより、ほぼ完全な配列マスキングが生成されます。オフセット( $ object [foo] )でアクセスできます。 < code> foreach -loop、および他の多くのもの。

しかし、私ができないのは、ネイティブ配列のイテレータ関数( next() reset() current()、 key())。 PHPは頑固にそのメンバー変数を反復処理しようとするようであり、イテレータメソッドを完全に無視します。

オブジェクトを残りの配列横断関数にフックするインターフェースがありますか、それとも私が持っているものにこだわっていますか?

更新: IteratorAggregateも答えではないようです。 foreach ループで使用されますが、基本的な配列イテレータ関数はメソッドを呼び出しません。

役に立ちましたか?

解決

PHPの最近の変更により、標準の配列関数(reset、nextなど)を使用してArrayIteratorsフォームを操作できなくなりました。

これはすぐに復元する必要があります。 http://news.php.net/php.internals/42015

他のヒント

これを機能させる1つの方法は、独自のイテレータを別のクラスで定義し、メインクラスにデフォルトのイテレータの代わりにその新しいイテレータを使用するように指示することです。

class MyIterator implements Iterator {
  public function key() {
    //
  }

  public function rewind() {
    //
  }

  // etc.

}

class MyMainClass implements IteratorAggregate {
  private 

これを機能させる1つの方法は、独自のイテレータを別のクラスで定義し、メインクラスにデフォルトのイテレータの代わりにその新しいイテレータを使用するように指示することです。

<*>

その後、必要なだけ制御する必要があります。 (そして、多くのクラスで独自のMyIteratorを再利用できます。)

上記のテストは行われていませんが、原理は正しいと思います。

これがお役に立てば幸いです!

data = array(); // getIterator is required for the IteratorAggregate interface. public function getIterator() { return new MyIterator($this->_data); } // etc. }

その後、必要なだけ制御する必要があります。 (そして、多くのクラスで独自のMyIteratorを再利用できます。)

上記のテストは行われていませんが、原理は正しいと思います。

これがお役に立てば幸いです!

ArrayIterator は見ているものではありませんにとって?または、 ArrayObject はどうですか。これはSPLのインターフェースのようですあなたが達成しようとしていることに対して。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top