foreachLoop.013.phpt 9.8 KB

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