Pregunta

Tengo un objeto que implementa ArrayAccess , Iterator y Contable . Eso produce un enmascaramiento de matriz casi perfecto. Puedo acceder a él con compensaciones ( $ object [foo] ), puedo lanzarlo en un < code> foreach -loop, y muchas otras cosas.

Pero lo que no puedo hacer es dárselo a las funciones del iterador de matriz nativa ( next () , reset () , current () , key () ), aunque he implementado los métodos necesarios de Iterator. PHP parece obstinadamente intentar iterar a través de sus variables miembro, y no tiene en cuenta los métodos iteradores.

¿Hay una interfaz que enganche el objeto a las funciones de desplazamiento de matriz restantes, o estoy atascado con lo que tengo?

Actualización: IteratorAggregate tampoco parece ser la respuesta. Si bien se usa en bucles foreach , las funciones básicas del iterador de matriz no llaman a los métodos.

¿Fue útil?

Solución

Los cambios recientes en PHP evitan que el formulario ArrayIterators se manipule utilizando las funciones de matriz estándar (restablecer, siguiente, etc.).

Esto debería restaurarse pronto: http://news.php.net/php.internals/42015

Otros consejos

Una forma de hacer que esto funcione es definir su propio iterador en una clase separada, y luego decirle a su clase principal que use ese nuevo iterador en lugar del predeterminado.

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

  public function rewind() {
    //
  }

  // etc.

}

class MyMainClass implements IteratorAggregate {
  private 

Una forma de hacer que esto funcione es definir su propio iterador en una clase separada, y luego decirle a su clase principal que use ese nuevo iterador en lugar del predeterminado.

<*>

Entonces deberías tener tanto control como necesites. (Y puede reutilizar su propio MyIterator en varias clases).

No se realizaron pruebas en lo anterior, pero el principio es correcto, creo.

¡Espero que esto ayude!

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

Entonces deberías tener tanto control como necesites. (Y puede reutilizar su propio MyIterator en varias clases).

No se realizaron pruebas en lo anterior, pero el principio es correcto, creo.

¡Espero que esto ayude!

¿ ArrayIterator no es lo que está buscando? ¿para? O qué pasa con ArrayObject , que parece ser la interfaz de SPL por lo que estás tratando de lograr.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top