Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Iteratory z SPL a pętle
erix
post
Post #1





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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?
Go to the top of the page
+Quote Post
Vengeance
post
Post #2





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Wg mnie tylko foreach.
Go to the top of the page
+Quote Post
erix
post
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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...
Go to the top of the page
+Quote Post
Vengeance
post
Post #4





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Hmm, dziwna sprawa nieco...

Wynalazłem gdzieś taki listing (Countable nie ma tu żadnego znaczenia, po prostu potrzebny jest do mojej zabawki (IMG:http://forum.php.pl/style_emoticons/default/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...
Go to the top of the page
+Quote Post
gcdreak
post
Post #6





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


A jeśli byś urzył:
Kod
while($obj->valid()){
// wyciągasz co chcesz
}
Go to the top of the page
+Quote Post
erix
post
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Ja używam. (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.09.2025 - 08:46