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