Pergunta

Eu tenho um objeto que implementa ArrayAccess, Iterador e Contável.Isso produz um mascaramento de matriz quase perfeito.Posso acessá-lo com deslocamentos ($object[foo]), posso jogá-lo em um foreach-loop e muitas outras coisas.

Mas o que não posso fazer é entregá-lo às funções nativas do iterador do array (next(), reset(), current(), key()), embora eu tenha implementado os métodos necessários do Iterator.O PHP parece tentar teimosamente iterar através de suas variáveis ​​de membro e desconsidera totalmente os métodos iteradores.

Existe uma interface que conectaria o objeto às funções restantes de passagem de array ou estou preso ao que tenho?

Atualizar: IteratorAggregate também não parece ser a resposta.Embora seja usado em foreach-loops, as funções básicas do iterador de array não chamam os métodos.

Foi útil?

Solução

Mudanças recentes no PHP evitam que o formulário ArrayIterators seja manipulado usando as funções padrão do array (reset, next, etc).

Isso deve ser restaurado em breve:http://news.php.net/php.internals/42015

Outras dicas

Uma maneira de fazer isso funcionar é definir seu próprio iterador em uma classe separada e, em seguida, dizer à sua classe principal para usar esse novo iterador em vez do padrão.

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

  public function rewind() {
    //
  }

  // etc.

}

class MyMainClass implements IteratorAggregate {
  private $_data = array();

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

  // etc.

}

Então você deve ter tanto controle quanto precisar.(E você pode reutilizar seu próprio MyIterator em várias classes).

Nenhum teste foi feito acima, mas o princípio está correto, acredito.

Espero que isto ajude!

É Iterador de Lista não é o que você está procurando?Ou que tal ArrayObject, que parece ser a interface do SPL para o que você está tentando alcançar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top