xref: /PHP-7.0/tests/lang/foreachLoop.015.phpt (revision 97fe15db)
1--TEST--
2Directly modifying a REFERENCED array when foreach'ing over it while using &$value syntax.
3--FILE--
4<?php
5
6define('MAX_LOOPS',5);
7
8function withRefValue($elements, $transform) {
9	echo "\n---( Array with $elements element(s): )---\n";
10	//Build array:
11	for ($i=0; $i<$elements; $i++) {
12		$a[] = "v.$i";
13	}
14	$counter=0;
15
16	$ref = &$a;
17
18	echo "--> State of referenced array before loop:\n";
19	var_dump($a);
20
21	echo "--> Do loop:\n";
22	foreach ($a as $k=>&$v) {
23		echo "     iteration $counter:  \$k=$k; \$v=$v\n";
24		eval($transform);
25		$counter++;
26		if ($counter>MAX_LOOPS) {
27			echo "  ** Stuck in a loop! **\n";
28			break;
29		}
30	}
31
32	echo "--> State of array after loop:\n";
33	var_dump($a);
34}
35
36
37echo "\nPopping elements off end of a referenced array, using &\$value";
38$transform = 'array_pop($a);';
39withRefValue(1, $transform);
40withRefValue(2, $transform);
41withRefValue(3, $transform);
42withRefValue(4, $transform);
43
44echo "\n\n\nShift elements off start of a referenced array, using &\$value";
45$transform = 'array_shift($a);';
46withRefValue(1, $transform);
47withRefValue(2, $transform);
48withRefValue(3, $transform);
49withRefValue(4, $transform);
50
51echo "\n\n\nRemove current element of a referenced array, using &\$value";
52$transform = 'unset($a[$k]);';
53withRefValue(1, $transform);
54withRefValue(2, $transform);
55withRefValue(3, $transform);
56withRefValue(4, $transform);
57
58echo "\n\n\nAdding elements to the end of a referenced array, using &\$value";
59$transform = 'array_push($a, "new.$counter");';
60withRefValue(1, $transform);
61withRefValue(2, $transform);
62withRefValue(3, $transform);
63withRefValue(4, $transform);
64
65echo "\n\n\nAdding elements to the start of a referenced array, using &\$value";
66$transform = 'array_unshift($a, "new.$counter");';
67withRefValue(1, $transform);
68withRefValue(2, $transform);
69withRefValue(3, $transform);
70withRefValue(4, $transform);
71
72?>
73--EXPECT--
74
75Popping elements off end of a referenced array, using &$value
76---( Array with 1 element(s): )---
77--> State of referenced array before loop:
78array(1) {
79  [0]=>
80  string(3) "v.0"
81}
82--> Do loop:
83     iteration 0:  $k=0; $v=v.0
84--> State of array after loop:
85array(0) {
86}
87
88---( Array with 2 element(s): )---
89--> State of referenced array before loop:
90array(2) {
91  [0]=>
92  string(3) "v.0"
93  [1]=>
94  string(3) "v.1"
95}
96--> Do loop:
97     iteration 0:  $k=0; $v=v.0
98--> State of array after loop:
99array(1) {
100  [0]=>
101  &string(3) "v.0"
102}
103
104---( Array with 3 element(s): )---
105--> State of referenced array before loop:
106array(3) {
107  [0]=>
108  string(3) "v.0"
109  [1]=>
110  string(3) "v.1"
111  [2]=>
112  string(3) "v.2"
113}
114--> Do loop:
115     iteration 0:  $k=0; $v=v.0
116     iteration 1:  $k=1; $v=v.1
117--> State of array after loop:
118array(1) {
119  [0]=>
120  string(3) "v.0"
121}
122
123---( Array with 4 element(s): )---
124--> State of referenced array before loop:
125array(4) {
126  [0]=>
127  string(3) "v.0"
128  [1]=>
129  string(3) "v.1"
130  [2]=>
131  string(3) "v.2"
132  [3]=>
133  string(3) "v.3"
134}
135--> Do loop:
136     iteration 0:  $k=0; $v=v.0
137     iteration 1:  $k=1; $v=v.1
138--> State of array after loop:
139array(2) {
140  [0]=>
141  string(3) "v.0"
142  [1]=>
143  &string(3) "v.1"
144}
145
146
147
148Shift elements off start of a referenced array, using &$value
149---( Array with 1 element(s): )---
150--> State of referenced array before loop:
151array(1) {
152  [0]=>
153  string(3) "v.0"
154}
155--> Do loop:
156     iteration 0:  $k=0; $v=v.0
157--> State of array after loop:
158array(0) {
159}
160
161---( Array with 2 element(s): )---
162--> State of referenced array before loop:
163array(2) {
164  [0]=>
165  string(3) "v.0"
166  [1]=>
167  string(3) "v.1"
168}
169--> Do loop:
170     iteration 0:  $k=0; $v=v.0
171     iteration 1:  $k=0; $v=v.1
172--> State of array after loop:
173array(0) {
174}
175
176---( Array with 3 element(s): )---
177--> State of referenced array before loop:
178array(3) {
179  [0]=>
180  string(3) "v.0"
181  [1]=>
182  string(3) "v.1"
183  [2]=>
184  string(3) "v.2"
185}
186--> Do loop:
187     iteration 0:  $k=0; $v=v.0
188     iteration 1:  $k=0; $v=v.1
189     iteration 2:  $k=0; $v=v.2
190--> State of array after loop:
191array(0) {
192}
193
194---( Array with 4 element(s): )---
195--> State of referenced array before loop:
196array(4) {
197  [0]=>
198  string(3) "v.0"
199  [1]=>
200  string(3) "v.1"
201  [2]=>
202  string(3) "v.2"
203  [3]=>
204  string(3) "v.3"
205}
206--> Do loop:
207     iteration 0:  $k=0; $v=v.0
208     iteration 1:  $k=0; $v=v.1
209     iteration 2:  $k=0; $v=v.2
210     iteration 3:  $k=0; $v=v.3
211--> State of array after loop:
212array(0) {
213}
214
215
216
217Remove current element of a referenced array, using &$value
218---( Array with 1 element(s): )---
219--> State of referenced array before loop:
220array(1) {
221  [0]=>
222  string(3) "v.0"
223}
224--> Do loop:
225     iteration 0:  $k=0; $v=v.0
226--> State of array after loop:
227array(0) {
228}
229
230---( Array with 2 element(s): )---
231--> State of referenced array before loop:
232array(2) {
233  [0]=>
234  string(3) "v.0"
235  [1]=>
236  string(3) "v.1"
237}
238--> Do loop:
239     iteration 0:  $k=0; $v=v.0
240     iteration 1:  $k=1; $v=v.1
241--> State of array after loop:
242array(0) {
243}
244
245---( Array with 3 element(s): )---
246--> State of referenced array before loop:
247array(3) {
248  [0]=>
249  string(3) "v.0"
250  [1]=>
251  string(3) "v.1"
252  [2]=>
253  string(3) "v.2"
254}
255--> Do loop:
256     iteration 0:  $k=0; $v=v.0
257     iteration 1:  $k=1; $v=v.1
258     iteration 2:  $k=2; $v=v.2
259--> State of array after loop:
260array(0) {
261}
262
263---( Array with 4 element(s): )---
264--> State of referenced array before loop:
265array(4) {
266  [0]=>
267  string(3) "v.0"
268  [1]=>
269  string(3) "v.1"
270  [2]=>
271  string(3) "v.2"
272  [3]=>
273  string(3) "v.3"
274}
275--> Do loop:
276     iteration 0:  $k=0; $v=v.0
277     iteration 1:  $k=1; $v=v.1
278     iteration 2:  $k=2; $v=v.2
279     iteration 3:  $k=3; $v=v.3
280--> State of array after loop:
281array(0) {
282}
283
284
285
286Adding elements to the end of a referenced array, using &$value
287---( Array with 1 element(s): )---
288--> State of referenced array before loop:
289array(1) {
290  [0]=>
291  string(3) "v.0"
292}
293--> Do loop:
294     iteration 0:  $k=0; $v=v.0
295     iteration 1:  $k=1; $v=new.0
296     iteration 2:  $k=2; $v=new.1
297     iteration 3:  $k=3; $v=new.2
298     iteration 4:  $k=4; $v=new.3
299     iteration 5:  $k=5; $v=new.4
300  ** Stuck in a loop! **
301--> State of array after loop:
302array(7) {
303  [0]=>
304  string(3) "v.0"
305  [1]=>
306  string(5) "new.0"
307  [2]=>
308  string(5) "new.1"
309  [3]=>
310  string(5) "new.2"
311  [4]=>
312  string(5) "new.3"
313  [5]=>
314  &string(5) "new.4"
315  [6]=>
316  string(5) "new.5"
317}
318
319---( Array with 2 element(s): )---
320--> State of referenced array before loop:
321array(2) {
322  [0]=>
323  string(3) "v.0"
324  [1]=>
325  string(3) "v.1"
326}
327--> Do loop:
328     iteration 0:  $k=0; $v=v.0
329     iteration 1:  $k=1; $v=v.1
330     iteration 2:  $k=2; $v=new.0
331     iteration 3:  $k=3; $v=new.1
332     iteration 4:  $k=4; $v=new.2
333     iteration 5:  $k=5; $v=new.3
334  ** Stuck in a loop! **
335--> State of array after loop:
336array(8) {
337  [0]=>
338  string(3) "v.0"
339  [1]=>
340  string(3) "v.1"
341  [2]=>
342  string(5) "new.0"
343  [3]=>
344  string(5) "new.1"
345  [4]=>
346  string(5) "new.2"
347  [5]=>
348  &string(5) "new.3"
349  [6]=>
350  string(5) "new.4"
351  [7]=>
352  string(5) "new.5"
353}
354
355---( Array with 3 element(s): )---
356--> State of referenced array before loop:
357array(3) {
358  [0]=>
359  string(3) "v.0"
360  [1]=>
361  string(3) "v.1"
362  [2]=>
363  string(3) "v.2"
364}
365--> Do loop:
366     iteration 0:  $k=0; $v=v.0
367     iteration 1:  $k=1; $v=v.1
368     iteration 2:  $k=2; $v=v.2
369     iteration 3:  $k=3; $v=new.0
370     iteration 4:  $k=4; $v=new.1
371     iteration 5:  $k=5; $v=new.2
372  ** Stuck in a loop! **
373--> State of array after loop:
374array(9) {
375  [0]=>
376  string(3) "v.0"
377  [1]=>
378  string(3) "v.1"
379  [2]=>
380  string(3) "v.2"
381  [3]=>
382  string(5) "new.0"
383  [4]=>
384  string(5) "new.1"
385  [5]=>
386  &string(5) "new.2"
387  [6]=>
388  string(5) "new.3"
389  [7]=>
390  string(5) "new.4"
391  [8]=>
392  string(5) "new.5"
393}
394
395---( Array with 4 element(s): )---
396--> State of referenced array before loop:
397array(4) {
398  [0]=>
399  string(3) "v.0"
400  [1]=>
401  string(3) "v.1"
402  [2]=>
403  string(3) "v.2"
404  [3]=>
405  string(3) "v.3"
406}
407--> Do loop:
408     iteration 0:  $k=0; $v=v.0
409     iteration 1:  $k=1; $v=v.1
410     iteration 2:  $k=2; $v=v.2
411     iteration 3:  $k=3; $v=v.3
412     iteration 4:  $k=4; $v=new.0
413     iteration 5:  $k=5; $v=new.1
414  ** Stuck in a loop! **
415--> State of array after loop:
416array(10) {
417  [0]=>
418  string(3) "v.0"
419  [1]=>
420  string(3) "v.1"
421  [2]=>
422  string(3) "v.2"
423  [3]=>
424  string(3) "v.3"
425  [4]=>
426  string(5) "new.0"
427  [5]=>
428  &string(5) "new.1"
429  [6]=>
430  string(5) "new.2"
431  [7]=>
432  string(5) "new.3"
433  [8]=>
434  string(5) "new.4"
435  [9]=>
436  string(5) "new.5"
437}
438
439
440
441Adding elements to the start of a referenced array, using &$value
442---( Array with 1 element(s): )---
443--> State of referenced array before loop:
444array(1) {
445  [0]=>
446  string(3) "v.0"
447}
448--> Do loop:
449     iteration 0:  $k=0; $v=v.0
450--> State of array after loop:
451array(2) {
452  [0]=>
453  string(5) "new.0"
454  [1]=>
455  &string(3) "v.0"
456}
457
458---( Array with 2 element(s): )---
459--> State of referenced array before loop:
460array(2) {
461  [0]=>
462  string(3) "v.0"
463  [1]=>
464  string(3) "v.1"
465}
466--> Do loop:
467     iteration 0:  $k=0; $v=v.0
468     iteration 1:  $k=2; $v=v.1
469--> State of array after loop:
470array(4) {
471  [0]=>
472  string(5) "new.1"
473  [1]=>
474  string(5) "new.0"
475  [2]=>
476  string(3) "v.0"
477  [3]=>
478  &string(3) "v.1"
479}
480
481---( Array with 3 element(s): )---
482--> State of referenced array before loop:
483array(3) {
484  [0]=>
485  string(3) "v.0"
486  [1]=>
487  string(3) "v.1"
488  [2]=>
489  string(3) "v.2"
490}
491--> Do loop:
492     iteration 0:  $k=0; $v=v.0
493     iteration 1:  $k=3; $v=v.2
494--> State of array after loop:
495array(5) {
496  [0]=>
497  string(5) "new.1"
498  [1]=>
499  string(5) "new.0"
500  [2]=>
501  string(3) "v.0"
502  [3]=>
503  string(3) "v.1"
504  [4]=>
505  &string(3) "v.2"
506}
507
508---( Array with 4 element(s): )---
509--> State of referenced array before loop:
510array(4) {
511  [0]=>
512  string(3) "v.0"
513  [1]=>
514  string(3) "v.1"
515  [2]=>
516  string(3) "v.2"
517  [3]=>
518  string(3) "v.3"
519}
520--> Do loop:
521     iteration 0:  $k=0; $v=v.0
522     iteration 1:  $k=4; $v=v.3
523--> State of array after loop:
524array(6) {
525  [0]=>
526  string(5) "new.1"
527  [1]=>
528  string(5) "new.0"
529  [2]=>
530  string(3) "v.0"
531  [3]=>
532  string(3) "v.1"
533  [4]=>
534  string(3) "v.2"
535  [5]=>
536  &string(3) "v.3"
537}
538