Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Iteratory z SPL a pętle
Forum PHP.pl > Forum > PHP > Object-oriented programming
erix
Czy jest możliwość iterowania po interfejsach Traversable/Iterator za pomocą innej pętli niż foreach" title="Zobacz w manualu PHP" target="_manual?

Np. ArrayIterator/ArrayObject za pomocą konstrukcji:
  1. <?php
  2. while(list(,$v) = each($iteratorHandle)){
  3. ?>


Ta mi nie działa?
Vengeance
Wg mnie tylko foreach.
erix
Hmm, w komentarzach wczoraj jeszcze to znalazłem: http://us3.php.net/manual/en/language.oop5...tions.php#75215

Tylko foreach" title="Zobacz w manualu PHP" target="_manual, ale nie rozumiem, czemu np. next" title="Zobacz w manualu PHP" target="_manual działa ok...
Vengeance
Może rozwiązania trzeba by poszukać w źródłach PHP. Być może foreach korzysta z next() a while() już nie? Nie mam pojęcia.

Kolejna sprawa: wg tego co pisze w komentarzu:
Cytat
If you do
<?
reset($a);
next($a);
echo current($a);
?>
where $a is defined over the suggested template, then the first element will be output, not the second, as expected.

To next chyba nie do końca działa?
erix
Hmm, dziwna sprawa nieco...

Wynalazłem gdzieś taki listing (Countable nie ma tu żadnego znaczenia, po prostu potrzebny jest do mojej zabawki tongue.gif):
  1. <?php
  2. class x implements Iterator, Countable {
  3.    private $position = 0;
  4.    private $array = array(
  5.        "firstelement",
  6.        "secondelement",
  7.        "lastelement",
  8.    );
  9.  
  10.    public function __construct() {
  11.        $this->position = 0;
  12.    }
  13.  
  14.    function rewind() {
  15.        $this->position = 0;
  16.    }
  17.  
  18.    function current() {
  19.        return $this->array[$this->position];
  20.    }
  21.  
  22.    function key() {
  23.        return $this->position;
  24.    }
  25.  
  26.    function next() {
  27.        ++$this->position;
  28.    }
  29.  
  30.    function valid() {
  31.        return isset($this->array[$this->position]);
  32.  
  33.    }
  34.  
  35. function count(){
  36. return 6;
  37. }
  38. }
  39.  
  40. $x = new x;
  41. ?>


Wczoraj podczas moich prób next" title="Zobacz w manualu PHP" target="_manual zwracał wartość wg interfejsu Iterator, dzisiaj się zachowuje jak each" title="Zobacz w manualu PHP" target="_manual - iteruje po własnościach klasy... O.o

Na tym samym hoście, ten sam interpreter... Zupełny zonk...
gcdreak
A jeśli byś urzył:
Kod
while($obj->valid()){
// wyciągasz co chcesz
}
erix
Ja używam. tongue.gif

Wiem, że tak się da, ale chciałem po prostu osiągnąć coś a'la Prototype; wykorzystać jak najwięcej funkcji interpretera tak, aby Iterator był interfejsem przezroczystym w implementacji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.