Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

João Batista Neto

1.7 SPL - LimitIterator

Recommended Posts

Da última vez, falamos sobre um Iterator da SPL chamado FilterIterator e como podemos filtrar dados com ele, hoje vamos falar de um Iterator que tem um funcionamento bem parecido, mas com um objetivo bastante distinto, o LimitIterator.

Quem já trabalhou com MySQL, já deve ter trabalhado com a cláusula LIMIT para limitar resultados ou para fazer paginação, bom, o LimitIterator tem exatamente esse mesmo objetivo, limitar os elementos de um Iterator ou fazer uma paginação com esses elementos.

Imaginem o seguinte:

Temos uma aplicação, onde permitimos que um cliente faça upload de 1 arquivo CSV contendo uma lista de emails para envio de uma campanha, porém, como nosso cliente está utilizando uma conta que só permite o envio de emails para 5 pessoas, se ele enviar um arquivo contendo 10 emails, teremos que ignorar o restante (ou sugerir que ele faça um upgrade da conta).

Supondo que o cliente já enviou o arquivo CSV e que seu conteúdo seja:

arquivo.csv

Fulano,fulano@dominio.com.br Teste,testando Beltrano,beltrano@exemplo.com.br Cicrano,10 João,joao@test.com Batista,batista@dominio.com.br Neto,neto@test.com PHP,php@php.net Outro,outro@teste.com.br Mais Um,mais.um@teste.com.br


Então, utilizando nosso CSVIterator, vamos ver como funciona:

$csv = new CSV( 'arquivo.csv' );
$csv->open();

foreach ( $csv->getIterator() as $linha => $dados ) {
var_dump( $dados );
}



A saída:

 

array(2) { [0]=> string(6) "Fulano" [1]=> string(21) "fulano@dominio.com.br" } array(2) { [0]=> string(5) "Teste" [1]=> string(8) "testando" } array(2) { [0]=> string(8) "Beltrano" [1]=> string(23) "beltrano@exemplo.com.br" } array(2) { [0]=> string(7) "Cicrano" [1]=> string(2) "10" } array(2) { [0]=> string(5) "João" [1]=> string(13) "joao@test.com" } array(2) { [0]=> string(7) "Batista" [1]=> string(22) "batista@dominio.com.br" } array(2) { [0]=> string(4) "Neto" [1]=> string(13) "neto@test.com" } array(2) { [0]=> string(3) "PHP" [1]=> string(11) "php@php.net" } array(2) { [0]=> string(5) "Outro" [1]=> string(18) "outro@teste.com.br" }


Percebam que vieram vários registros, muito além dos 5 permitidos pela aplicação, usando LimitIterator, conseguimos limitar esses registros aos 5 permitidos:

$csv = new CSV( 'arquivo.csv' );
$csv->open();

foreach ( new LimitIterator( $csv->getIterator() , 0 , 5 ) as $linha => $dados ) {
var_dump( $dados );
}



Agora a saída:

 

 

array(2) { [0]=> string(6) "Fulano" [1]=> string(21) "fulano@dominio.com.br" } array(2) { [0]=> string(5) "Teste" [1]=> string(8) "testando" } array(2) { [0]=> string(8) "Beltrano" [1]=> string(23) "beltrano@exemplo.com.br" } array(2) { [0]=> string(7) "Cicrano" [1]=> string(2) "10" } array(2) { [0]=> string(5) "João" [1]=> string(13) "joao@test.com" }


Como todos já devem ter passado por isso, nossos clientes insistem em enviar listas de emails, contendo valores que nem são parecidos com emails, então, antes de poder limitar a quantidade, precisamos filtrar esses registros e recuperar apenas os que contenham emails válidos, como já falamos sobre a FilterIterator, vamos apenas demonstrar:

ClientEmailFilterIterator.php

class ClientEmailFilterIterator extends FilterIterator {
public function accept(){
$current = $this->getInnerIterator()->current();

return filter_var( $current[ 1 ] , FILTER_VALIDATE_EMAIL );
}
}



Agora, vamos filtrar e limitar os resultados:

$csv = new CSV( 'arquivo.csv' );
$csv->open();

foreach ( new LimitIterator( new ClientEmailFilterIterator( $csv->getIterator() ) , 0 , 5 ) as $linha => $dados ) {
var_dump( $dados );
}



Agora, a saída:

 

 

array(2) { [0]=> string(6) "Fulano" [1]=> string(21) "fulano@dominio.com.br" } array(2) { [0]=> string(8) "Beltrano" [1]=> string(23) "beltrano@exemplo.com.br" } array(2) { [0]=> string(5) "João" [1]=> string(13) "joao@test.com" } array(2) { [0]=> string(7) "Batista" [1]=> string(22) "batista@dominio.com.br" } array(2) { [0]=> string(4) "Neto" [1]=> string(13) "neto@test.com" }


Agora com esses dados, basta que troquemos o var_dump() pelo nosso objeto que fará de fato, o envio dos emails.

Bom, funciona assim:

1. A LimitIterator é uma classe concreta, isso significa que podemos utilizá-la como está.
2. O método construtor da LimitIterator precisa necessariamente receber um Iterator, que será o InnerIterator (igual à FilterIterator).
3. Quando passamos um Iterator qualquer para o construtor, esse Iterator fica encapsulado na LimitIterator. Para que possamos acessá-lo, precisamos usar o método getInnerIterator(), que faz justamente isso, retorna o Iterator que passamos para o construtor.
4. O segundo parâmetro, que nesse caso utilizamos 0 é a posição onde o Iterator será iniciado (no próximo artigo demonstraremos paginação com esse parâmetro).
5. O terceiro parâmetro é o limite de elementos que serão iterados, no caso, como utilizamos 5, apenas 5 registros serão iterados.

Com isso, podemos criar um sistema de limite de elementos ou até paginações como fazemos com banco de dados, apenas modificando o valor inicial (segundo parâmetro).

Bom, por hora é só, no próximo tópico da série PHP Orientado a Objetos, continuaremos falando sobre a SPL.

 

 

 

Índice Imagem Postada

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostaria de parabenizá-lo por este cusro...

 

Mesmo com 4 anos de PHP tem muita coisa aqui que eu desconhecia, principalmente do módulo II

 

Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.