Annotation of embedaddon/php/tests/lang/foreachLoopIteratorAggregate.001.phpt, revision 1.1.1.1

1.1       misho       1: --TEST--
                      2: foreach with iteratorAggregate
                      3: --FILE--
                      4: <?php
                      5: class EnglishMealIterator implements Iterator {
                      6:        private $pos=0;
                      7:        private $myContent=array("breakfast", "dinner", "tea");
                      8:        
                      9:        public function valid() {
                     10:                global $indent;
                     11:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
                     12:                return $this->pos < count($this->myContent);
                     13:        }
                     14:        
                     15:        public function next() {
                     16:                global $indent;
                     17:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
                     18:                $this->pos++;
                     19:        }
                     20:        
                     21:        public function rewind() {
                     22:                global $indent;
                     23:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
                     24:                $this->pos=0;
                     25:        }
                     26: 
                     27:        public function current() {
                     28:                global $indent;
                     29:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
                     30:                return $this->myContent[$this->pos];
                     31:        }
                     32:        
                     33:        public function key() {
                     34:                global $indent;
                     35:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
                     36:                return "meal " . $this->pos;
                     37:        }
                     38:        
                     39: }
                     40: 
                     41: class FrenchMealIterator implements Iterator {
                     42:        private $pos=0;
                     43:        private $myContent=array("petit dejeuner", "dejeuner", "gouter", "dinner");
                     44:        
                     45:        public function valid() {
                     46:                global $indent;
                     47:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
                     48:                return $this->pos < count($this->myContent);
                     49:        }
                     50:        
                     51:        public function next() {
                     52:                global $indent;
                     53:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
                     54:                $this->pos++;
                     55:        }
                     56:        
                     57:        public function rewind() {
                     58:                global $indent;
                     59:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
                     60:                $this->pos=0;
                     61:        }
                     62: 
                     63:        public function current() {
                     64:                global $indent;
                     65:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
                     66:                return $this->myContent[$this->pos];
                     67:        }
                     68:        
                     69:        public function key() {
                     70:                global $indent;
                     71:                echo "$indent--> " . __METHOD__ . " ($this->pos)\n";
                     72:                return "meal " . $this->pos;
                     73:        }
                     74:        
                     75: }
                     76: 
                     77: 
                     78: Class EuropeanMeals implements IteratorAggregate {
                     79:        
                     80:        private $storedEnglishMealIterator;
                     81:        private $storedFrenchMealIterator;
                     82:        
                     83:        public function __construct() {
                     84:                $this->storedEnglishMealIterator = new EnglishMealIterator;
                     85:                $this->storedFrenchMealIterator = new FrenchMealIterator;
                     86:        }
                     87:        
                     88:        public function getIterator() {
                     89:                global $indent;
                     90:                echo "$indent--> " . __METHOD__  . "\n";
                     91:                
                     92:                //Alternate between English and French meals
                     93:                static $i = 0;
                     94:                if ($i++%2 == 0) {
                     95:                        return $this->storedEnglishMealIterator;
                     96:                } else {
                     97:                        return $this->storedFrenchMealIterator;
                     98:                }
                     99:        }
                    100:        
                    101: }
                    102: 
                    103: $f = new EuropeanMeals;
                    104: var_dump($f);
                    105: 
                    106: echo "-----( Simple iteration 1: )-----\n";
                    107: foreach ($f as $k=>$v) {
                    108:        echo "$k => $v\n";      
                    109: }
                    110: echo "-----( Simple iteration 2: )-----\n";
                    111: foreach ($f as $k=>$v) {
                    112:        echo "$k => $v\n";      
                    113: }
                    114: 
                    115: 
                    116: $indent = " ";
                    117: echo "\n\n\n-----( Nested iteration: )-----\n";
                    118: $count=1;
                    119: foreach ($f as $k=>$v) {
                    120:        echo "\nTop level "  .  $count++ . ": \n"; 
                    121:        echo "$k => $v\n";
                    122:        $indent = "     ";
                    123:        foreach ($f as $k=>$v) {
                    124:                echo "     $k => $v\n"; 
                    125:        }
                    126:        $indent = " ";
                    127: }
                    128: 
                    129: 
                    130: ?>
                    131: ===DONE===
                    132: --EXPECTF--
                    133: object(EuropeanMeals)#%d (2) {
                    134:   ["storedEnglishMealIterator":"EuropeanMeals":private]=>
                    135:   object(EnglishMealIterator)#%d (2) {
                    136:     ["pos":"EnglishMealIterator":private]=>
                    137:     int(0)
                    138:     ["myContent":"EnglishMealIterator":private]=>
                    139:     array(3) {
                    140:       [0]=>
                    141:       string(9) "breakfast"
                    142:       [1]=>
                    143:       string(6) "dinner"
                    144:       [2]=>
                    145:       string(3) "tea"
                    146:     }
                    147:   }
                    148:   ["storedFrenchMealIterator":"EuropeanMeals":private]=>
                    149:   object(FrenchMealIterator)#%d (2) {
                    150:     ["pos":"FrenchMealIterator":private]=>
                    151:     int(0)
                    152:     ["myContent":"FrenchMealIterator":private]=>
                    153:     array(4) {
                    154:       [0]=>
                    155:       string(14) "petit dejeuner"
                    156:       [1]=>
                    157:       string(8) "dejeuner"
                    158:       [2]=>
                    159:       string(6) "gouter"
                    160:       [3]=>
                    161:       string(6) "dinner"
                    162:     }
                    163:   }
                    164: }
                    165: -----( Simple iteration 1: )-----
                    166: --> EuropeanMeals::getIterator
                    167: --> EnglishMealIterator::rewind (0)
                    168: --> EnglishMealIterator::valid (0)
                    169: --> EnglishMealIterator::current (0)
                    170: --> EnglishMealIterator::key (0)
                    171: meal 0 => breakfast
                    172: --> EnglishMealIterator::next (0)
                    173: --> EnglishMealIterator::valid (1)
                    174: --> EnglishMealIterator::current (1)
                    175: --> EnglishMealIterator::key (1)
                    176: meal 1 => dinner
                    177: --> EnglishMealIterator::next (1)
                    178: --> EnglishMealIterator::valid (2)
                    179: --> EnglishMealIterator::current (2)
                    180: --> EnglishMealIterator::key (2)
                    181: meal 2 => tea
                    182: --> EnglishMealIterator::next (2)
                    183: --> EnglishMealIterator::valid (3)
                    184: -----( Simple iteration 2: )-----
                    185: --> EuropeanMeals::getIterator
                    186: --> FrenchMealIterator::rewind (0)
                    187: --> FrenchMealIterator::valid (0)
                    188: --> FrenchMealIterator::current (0)
                    189: --> FrenchMealIterator::key (0)
                    190: meal 0 => petit dejeuner
                    191: --> FrenchMealIterator::next (0)
                    192: --> FrenchMealIterator::valid (1)
                    193: --> FrenchMealIterator::current (1)
                    194: --> FrenchMealIterator::key (1)
                    195: meal 1 => dejeuner
                    196: --> FrenchMealIterator::next (1)
                    197: --> FrenchMealIterator::valid (2)
                    198: --> FrenchMealIterator::current (2)
                    199: --> FrenchMealIterator::key (2)
                    200: meal 2 => gouter
                    201: --> FrenchMealIterator::next (2)
                    202: --> FrenchMealIterator::valid (3)
                    203: --> FrenchMealIterator::current (3)
                    204: --> FrenchMealIterator::key (3)
                    205: meal 3 => dinner
                    206: --> FrenchMealIterator::next (3)
                    207: --> FrenchMealIterator::valid (4)
                    208: 
                    209: 
                    210: 
                    211: -----( Nested iteration: )-----
                    212:  --> EuropeanMeals::getIterator
                    213:  --> EnglishMealIterator::rewind (3)
                    214:  --> EnglishMealIterator::valid (0)
                    215:  --> EnglishMealIterator::current (0)
                    216:  --> EnglishMealIterator::key (0)
                    217: 
                    218: Top level 1: 
                    219: meal 0 => breakfast
                    220:      --> EuropeanMeals::getIterator
                    221:      --> FrenchMealIterator::rewind (4)
                    222:      --> FrenchMealIterator::valid (0)
                    223:      --> FrenchMealIterator::current (0)
                    224:      --> FrenchMealIterator::key (0)
                    225:      meal 0 => petit dejeuner
                    226:      --> FrenchMealIterator::next (0)
                    227:      --> FrenchMealIterator::valid (1)
                    228:      --> FrenchMealIterator::current (1)
                    229:      --> FrenchMealIterator::key (1)
                    230:      meal 1 => dejeuner
                    231:      --> FrenchMealIterator::next (1)
                    232:      --> FrenchMealIterator::valid (2)
                    233:      --> FrenchMealIterator::current (2)
                    234:      --> FrenchMealIterator::key (2)
                    235:      meal 2 => gouter
                    236:      --> FrenchMealIterator::next (2)
                    237:      --> FrenchMealIterator::valid (3)
                    238:      --> FrenchMealIterator::current (3)
                    239:      --> FrenchMealIterator::key (3)
                    240:      meal 3 => dinner
                    241:      --> FrenchMealIterator::next (3)
                    242:      --> FrenchMealIterator::valid (4)
                    243:  --> EnglishMealIterator::next (0)
                    244:  --> EnglishMealIterator::valid (1)
                    245:  --> EnglishMealIterator::current (1)
                    246:  --> EnglishMealIterator::key (1)
                    247: 
                    248: Top level 2: 
                    249: meal 1 => dinner
                    250:      --> EuropeanMeals::getIterator
                    251:      --> EnglishMealIterator::rewind (1)
                    252:      --> EnglishMealIterator::valid (0)
                    253:      --> EnglishMealIterator::current (0)
                    254:      --> EnglishMealIterator::key (0)
                    255:      meal 0 => breakfast
                    256:      --> EnglishMealIterator::next (0)
                    257:      --> EnglishMealIterator::valid (1)
                    258:      --> EnglishMealIterator::current (1)
                    259:      --> EnglishMealIterator::key (1)
                    260:      meal 1 => dinner
                    261:      --> EnglishMealIterator::next (1)
                    262:      --> EnglishMealIterator::valid (2)
                    263:      --> EnglishMealIterator::current (2)
                    264:      --> EnglishMealIterator::key (2)
                    265:      meal 2 => tea
                    266:      --> EnglishMealIterator::next (2)
                    267:      --> EnglishMealIterator::valid (3)
                    268:  --> EnglishMealIterator::next (3)
                    269:  --> EnglishMealIterator::valid (4)
                    270: ===DONE===

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>