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>