E-learn.ro
Panou utilizatori
Utilizator Parola
Creeaza cont nou    Recupereaza parola
Login
Newsletter
Introdu adresa ta de email
Inscrie-te
Inchide panoul de utilizatori
Add to Google

Tutoriale PHP

Descarca toolbar

Toolbar E-learn.ro Facebook Twitter

WEB DEVELOPMENT  /  PHP  /  Diverse (10)

Libraria Standard PHP - Lucrul cu interfata Iterator

15.09.2009
Libraria Standard PHP - Lucrul cu interfata Iterator

Interfata Iterator este implementata in core-ul engine-ului Zend 2.0 si faciliteaza parcurgerea unor structuri de date complexe(cu proprietatea de a se parcurge intern). La prima vedere pare ceva foarte complicat, insa va puteti gandi ca orice poate fi parcurs in PHP folosind foreach, for, while, poate fi manipulat prin aceasta interfata: de la un simplu vector pana la row-urile rezultate dintr-un query SQL, continutul unui director sau liniile dintr-un fisier text.

Total vizualizari: 7706 7706 afisari   |   Comentarii  4   |   Rating   |   (3 voturi)   |   Timp necesar: 15 min 15 min   |   Nivel de cunostiinte necesar: Avansat  Avansat

Autor: cborodescu Incepator
Download
Adauga la tutoriale favorit Adauga la tutoriale favorite
Pagina:
« 12 3
comenteaza printeaza

Un mic exemplu – RSSIterator

Chiar daca nu este foarte practic, acest exemplu va va ajuta sa intelegeti mai bine cum lucreaza defapt Iterator. Este limpede urmatorul exemplu(nu face rabat de la regula initializare-parcurgere):

<?php 
   
   //Incarcarea continutului RSS-ului
   $file = file_get_contents("http://www.e-learn.ro/rss.php?section=4");
   
   //Initializarea obiectului de tip SimpleXMLElement
   $xml = new SimpleXMLElement($file);
 
   //Parcurgerea obiectului initializat mai sus
   foreach($xml->channel->item as $feed){
      echo $feed->title.'<br>';
   }
 
?>

Trebuie retinut faptul ca avand de-aface cu niste metode abstracte, suntem obligati ca la implementarea clasei RSSIterator sa definim fiecare metoda in parte.

<?php
 
class RSSIterator implements Iterator {
    
  // Adresa de unde se incarca RSS-ul
  private $RSSUrl; 
    
  //Continutul RSS-ului
  private $RSSContent;
    
  //Index-ul elementului curent
  private $currentIndex = 0;
    
  //Elementul curent
  private $currentItem;
    
  //Numar total de elemente ce se gasesc in RSS
  private $noItems;
    
  public function __construct($RSSUrl) { 
        
       if($RSSUrl != null) {
            
         //Initializarea proprietatii $this->RSSUrl cu adresa RSS-ului
         $this->RSSUrl = $RSSUrl;            
            
         //Incarcarea RSS-ului folosind SimpleXML
         $this->RSSContent = simplexml_load_file($this->RSSUrl, 
         'SimpleXMLElement', LIBXML_ERR_NONE);
            
         //Initializarea numarului total de elemente din RSS
         $this->noItems = count($this->RSSContent->channel->item);
            
         //Initializarea elemntului curent
         $this->currentItem = $this->RSSContent->channel->item[0];
         
       }
        
  }
    
  public function rewind() {
        
       //Setarea index-ului curent la 0
       $this->currentIndex = 0;
        
       //Setarea elementului curent
       $this->currentItem = $this->RSSContent->channel->item[0];
  }
    
  public function current() {        
        
       //Se returneaza elementul curent
       return $this->currentItem;
        
  }
    
  public function key() {
        
      // Se returneaza index-ul curent
      return $this->currentIndex;
 
  }
    
  public function next() {
        
      //Incrementarea index-ului curent
      $this->currentIndex++;
        
      //Testare daca nu s-a ajuns la finalul RSS-ului
      if($this->currentIndex < $this->noItems) {
         /*
           Folosirea unei variabile auxiliare pentru a lucra mai usor 
           cu elementul curent din RSS    
         */
         $item = $this->RSSContent->channel->item;    
          
         //Initializarea elementului curent cu urmatorul element din RSS
         $this->currentItem = $item[$this->currentIndex];    
            
      }
        
  }
    
  public function valid() {
        
      /*
        Cat timp currentIndex este mai mic decat numarul total 
        de elemente din RSS nu s-a ajuns la finalul RSS-ului
      */
      if($this->currentIndex < $this->noItems)            
         return true;
      else 
         return false;
  }
  
}
 
?>

Acum, apelarea poate fi facuta in cele 2 moduri:

<?php
 
  //Instantierea clasei RSSIterator
  $RSSIterator = new  RSSIterator('http://www.e-learn.ro/rss.php?section=1');
  
  //Parcurgerea RSSIterator
  foreach ($RSSIterator as $Index  =&gt; $Value) {
     echo  '<br/>'.$Index.' '.$Value->title;<br>
  }
?>

sau

<?php
 
  //Resetarea RSSIterator
  $RSSIterator->rewind();
  
  //Parcurgerea RSSIterator
  while ($RSSIterator->valid()) {
  
     echo  '<br/>'.$RSSIterator->key().' '.$RSSIterator->current()->title;<br>
     $RSSIterator->next();<br>
     
  }
?>

Ca si observatie, este bine de stiut faptul ca apelarea folosind metodele obiectului RSSIterator este mai rapida decat utilizarea clasicului foreach, deoarece acesta din urma introduce un nou nivel de redirectare la executarea secventei propriu-zise de cod.

In speranta ca ati gasit util acest tutorial, va propun sa va implementati propria versiune de Iterator si sa postati codul in galeria de materiale(asa cum am facut-o si eu). In felul aceasta, avand mai multe exemple de implementare/utilizare, invatarea va deveni mai usoara.

Spor la lucru!

Pagina:
« 12 3
comenteaza printeaza

Cuvinte cheie:   php,   SPL,   php5,   iterator,   rss

Alte tutoriale PHP:
Noteaza acest tutorial
Rating tutorial
 
(3 voturi)
Pentru a nota acest tutorial, trebuie sa fii logat!
COMENTARII (4) spune-ti parerea
cata500 cata500 , Marti, 16 Februarie 2010, ora 20:24
#4

E foarte ok ii reusit ....felicitari celor care lau facut ..ac vreau sa postez si eu la asa ceva sa vad ce iasa

Raporteaza acest comentariu ca injurios!
alexandra alexandra , Miercuri, 16 Septembrie 2009, ora 12:25
#3

E ok, dar n-ar fi rau si un exemplu cu SimpleXMLIterator. Desigur, am un interes cand zic asta deoarece l-as folosi si eu :).

Raporteaza acest comentariu ca injurios!
cborodescu cborodescu , Miercuri, 16 Septembrie 2009, ora 11:14
#2

Da, voi scrie si alte tutoriale pentru SPL. Eu ma gandeam la Exceptii, ce parere ai?

Raporteaza acest comentariu ca injurios!
alexandra alexandra , Miercuri, 16 Septembrie 2009, ora 11:00
#1

Aveam nevoie la un moment dat sa afisez continutul unui xml si trebuie sa recunosc ca solutia gasita de mine nu e nici pe departe la fel de eleganta ca interfata Iterator. Ar fi super daca ai scrie tutoriale si despre alte interfete din SPL.

Raporteaza acest comentariu ca injurios!
Posteaza un comentariu
Pentru a posta un comentariu, trebuie sa fii logat!
0 TOP UTILIZATORI* 0 0
Tutoriale scrise de claibornelara
claibornelara Rang utilizator claibornelara - Incepator
5335
Tutoriale scrise de mcuemica
mcuemica Rang utilizator mcuemica - Incepator
5295
Tutoriale scrise de ellarichards
ellarichards Rang utilizator ellarichards - Incepator
5130
Tutoriale scrise de emonclercheap
emonclercheap Rang utilizator emonclercheap - Incepator
5125
Tutoriale scrise de beacherrosa
beacherrosa Rang utilizator beacherrosa - Incepator
4870
* Acest top reprezinta punctajele acumulate in ultimele 30 de zile.
Dreamweaver SEO XML Action Script COREL DRAW Illustrator Photoshop Python Swift 3D Powerpoint Word Sony Vegas Lightroom HTML Fireworks Verilog Fotografie Flash AJAX Bridge StyleSheet Gimp Ruby on Rails Outlook Excel Vista JSON PSD XHTML PHP Java SWF MySQL CSS RoR Javascript
Promovare:
Daca faci parte din comunitatea E-learn.ro si doresti promovarea acesteia, poti accesa pagina de promovare.
Arhiva newsletter:
Daca ai ratat un numar mai vechi, sau vrei sa revezi care au fost noutatile E-learn.ro la un moment dat, poti accesa arhiva de newslettere.
  Copyright © 2008-2013 E-LEARN.ro. Toate drepturile rezervate. Termeni si conditii.
Conceput si realizat de Neokinetics Software