foreachLoop.013.phpt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  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. --EXPECTF--
  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. iteration 1: $k=0; $v=v.0
  83. --> State of array after loop:
  84. array(0) {
  85. }
  86. ---( Array with 3 element(s): )---
  87. --> State of array before loop:
  88. array(3) {
  89. [0]=>
  90. string(3) "v.0"
  91. [1]=>
  92. string(3) "v.1"
  93. [2]=>
  94. string(3) "v.2"
  95. }
  96. --> Do loop:
  97. iteration 0: $k=0; $v=v.0
  98. iteration 1: $k=1; $v=v.1
  99. --> State of array after loop:
  100. array(1) {
  101. [0]=>
  102. string(3) "v.0"
  103. }
  104. ---( Array with 4 element(s): )---
  105. --> State of array before loop:
  106. array(4) {
  107. [0]=>
  108. string(3) "v.0"
  109. [1]=>
  110. string(3) "v.1"
  111. [2]=>
  112. string(3) "v.2"
  113. [3]=>
  114. string(3) "v.3"
  115. }
  116. --> Do loop:
  117. iteration 0: $k=0; $v=v.0
  118. iteration 1: $k=1; $v=v.1
  119. iteration 2: $k=0; $v=v.0
  120. iteration 3: $k=0; $v=v.0
  121. --> State of array after loop:
  122. array(0) {
  123. }
  124. Shift elements off start of an unreferenced array, using &$value.
  125. ---( Array with 1 element(s): )---
  126. --> State of array before loop:
  127. array(1) {
  128. [0]=>
  129. string(3) "v.0"
  130. }
  131. --> Do loop:
  132. iteration 0: $k=0; $v=v.0
  133. --> State of array after loop:
  134. array(0) {
  135. }
  136. ---( Array with 2 element(s): )---
  137. --> State of array before loop:
  138. array(2) {
  139. [0]=>
  140. string(3) "v.0"
  141. [1]=>
  142. string(3) "v.1"
  143. }
  144. --> Do loop:
  145. iteration 0: $k=0; $v=v.0
  146. iteration 1: $k=0; $v=v.1
  147. --> State of array after loop:
  148. array(0) {
  149. }
  150. ---( Array with 3 element(s): )---
  151. --> State of array before loop:
  152. array(3) {
  153. [0]=>
  154. string(3) "v.0"
  155. [1]=>
  156. string(3) "v.1"
  157. [2]=>
  158. string(3) "v.2"
  159. }
  160. --> Do loop:
  161. iteration 0: $k=0; $v=v.0
  162. iteration 1: $k=0; $v=v.1
  163. iteration 2: $k=0; $v=v.2
  164. --> State of array after loop:
  165. array(0) {
  166. }
  167. ---( Array with 4 element(s): )---
  168. --> State of array before loop:
  169. array(4) {
  170. [0]=>
  171. string(3) "v.0"
  172. [1]=>
  173. string(3) "v.1"
  174. [2]=>
  175. string(3) "v.2"
  176. [3]=>
  177. string(3) "v.3"
  178. }
  179. --> Do loop:
  180. iteration 0: $k=0; $v=v.0
  181. iteration 1: $k=0; $v=v.1
  182. iteration 2: $k=0; $v=v.2
  183. iteration 3: $k=0; $v=v.3
  184. --> State of array after loop:
  185. array(0) {
  186. }
  187. Remove current element of an unreferenced array, using &$value.
  188. ---( Array with 1 element(s): )---
  189. --> State of array before loop:
  190. array(1) {
  191. [0]=>
  192. string(3) "v.0"
  193. }
  194. --> Do loop:
  195. iteration 0: $k=0; $v=v.0
  196. --> State of array after loop:
  197. array(0) {
  198. }
  199. ---( Array with 2 element(s): )---
  200. --> State of array before loop:
  201. array(2) {
  202. [0]=>
  203. string(3) "v.0"
  204. [1]=>
  205. string(3) "v.1"
  206. }
  207. --> Do loop:
  208. iteration 0: $k=0; $v=v.0
  209. iteration 1: $k=1; $v=v.1
  210. --> State of array after loop:
  211. array(0) {
  212. }
  213. ---( Array with 3 element(s): )---
  214. --> State of array before loop:
  215. array(3) {
  216. [0]=>
  217. string(3) "v.0"
  218. [1]=>
  219. string(3) "v.1"
  220. [2]=>
  221. string(3) "v.2"
  222. }
  223. --> Do loop:
  224. iteration 0: $k=0; $v=v.0
  225. iteration 1: $k=1; $v=v.1
  226. iteration 2: $k=2; $v=v.2
  227. --> State of array after loop:
  228. array(0) {
  229. }
  230. ---( Array with 4 element(s): )---
  231. --> State of array before loop:
  232. array(4) {
  233. [0]=>
  234. string(3) "v.0"
  235. [1]=>
  236. string(3) "v.1"
  237. [2]=>
  238. string(3) "v.2"
  239. [3]=>
  240. string(3) "v.3"
  241. }
  242. --> Do loop:
  243. iteration 0: $k=0; $v=v.0
  244. iteration 1: $k=1; $v=v.1
  245. iteration 2: $k=2; $v=v.2
  246. iteration 3: $k=3; $v=v.3
  247. --> State of array after loop:
  248. array(0) {
  249. }
  250. Adding elements to the end of an unreferenced array, using &$value.
  251. ---( Array with 1 element(s): )---
  252. --> State of array before loop:
  253. array(1) {
  254. [0]=>
  255. string(3) "v.0"
  256. }
  257. --> Do loop:
  258. iteration 0: $k=0; $v=v.0
  259. --> State of array after loop:
  260. array(2) {
  261. [0]=>
  262. &string(3) "v.0"
  263. [1]=>
  264. string(5) "new.0"
  265. }
  266. ---( Array with 2 element(s): )---
  267. --> State of array before loop:
  268. array(2) {
  269. [0]=>
  270. string(3) "v.0"
  271. [1]=>
  272. string(3) "v.1"
  273. }
  274. --> Do loop:
  275. iteration 0: $k=0; $v=v.0
  276. iteration 1: $k=1; $v=v.1
  277. iteration 2: $k=2; $v=new.0
  278. iteration 3: $k=3; $v=new.1
  279. iteration 4: $k=4; $v=new.2
  280. iteration 5: $k=5; $v=new.3
  281. ** Stuck in a loop! **
  282. --> State of array after loop:
  283. array(8) {
  284. [0]=>
  285. string(3) "v.0"
  286. [1]=>
  287. string(3) "v.1"
  288. [2]=>
  289. string(5) "new.0"
  290. [3]=>
  291. string(5) "new.1"
  292. [4]=>
  293. string(5) "new.2"
  294. [5]=>
  295. &string(5) "new.3"
  296. [6]=>
  297. string(5) "new.4"
  298. [7]=>
  299. string(5) "new.5"
  300. }
  301. ---( Array with 3 element(s): )---
  302. --> State of array before loop:
  303. array(3) {
  304. [0]=>
  305. string(3) "v.0"
  306. [1]=>
  307. string(3) "v.1"
  308. [2]=>
  309. string(3) "v.2"
  310. }
  311. --> Do loop:
  312. iteration 0: $k=0; $v=v.0
  313. iteration 1: $k=1; $v=v.1
  314. iteration 2: $k=2; $v=v.2
  315. iteration 3: $k=3; $v=new.0
  316. iteration 4: $k=4; $v=new.1
  317. iteration 5: $k=5; $v=new.2
  318. ** Stuck in a loop! **
  319. --> State of array after loop:
  320. array(9) {
  321. [0]=>
  322. string(3) "v.0"
  323. [1]=>
  324. string(3) "v.1"
  325. [2]=>
  326. string(3) "v.2"
  327. [3]=>
  328. string(5) "new.0"
  329. [4]=>
  330. string(5) "new.1"
  331. [5]=>
  332. &string(5) "new.2"
  333. [6]=>
  334. string(5) "new.3"
  335. [7]=>
  336. string(5) "new.4"
  337. [8]=>
  338. string(5) "new.5"
  339. }
  340. ---( Array with 4 element(s): )---
  341. --> State of array before loop:
  342. array(4) {
  343. [0]=>
  344. string(3) "v.0"
  345. [1]=>
  346. string(3) "v.1"
  347. [2]=>
  348. string(3) "v.2"
  349. [3]=>
  350. string(3) "v.3"
  351. }
  352. --> Do loop:
  353. iteration 0: $k=0; $v=v.0
  354. iteration 1: $k=1; $v=v.1
  355. iteration 2: $k=2; $v=v.2
  356. iteration 3: $k=3; $v=v.3
  357. iteration 4: $k=4; $v=new.0
  358. iteration 5: $k=5; $v=new.1
  359. ** Stuck in a loop! **
  360. --> State of array after loop:
  361. array(10) {
  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. [4]=>
  371. string(5) "new.0"
  372. [5]=>
  373. &string(5) "new.1"
  374. [6]=>
  375. string(5) "new.2"
  376. [7]=>
  377. string(5) "new.3"
  378. [8]=>
  379. string(5) "new.4"
  380. [9]=>
  381. string(5) "new.5"
  382. }
  383. Adding elements to the start of an unreferenced array, using &$value.
  384. ---( Array with 1 element(s): )---
  385. --> State of array before loop:
  386. array(1) {
  387. [0]=>
  388. string(3) "v.0"
  389. }
  390. --> Do loop:
  391. iteration 0: $k=0; $v=v.0
  392. --> State of array after loop:
  393. array(2) {
  394. [0]=>
  395. string(5) "new.0"
  396. [1]=>
  397. &string(3) "v.0"
  398. }
  399. ---( Array with 2 element(s): )---
  400. --> State of array before loop:
  401. array(2) {
  402. [0]=>
  403. string(3) "v.0"
  404. [1]=>
  405. string(3) "v.1"
  406. }
  407. --> Do loop:
  408. iteration 0: $k=0; $v=v.0
  409. iteration 1: $k=0; $v=new.0
  410. iteration 2: $k=0; $v=new.1
  411. iteration 3: $k=0; $v=new.2
  412. iteration 4: $k=0; $v=new.3
  413. iteration 5: $k=0; $v=new.4
  414. ** Stuck in a loop! **
  415. --> State of array after loop:
  416. array(8) {
  417. [0]=>
  418. string(5) "new.5"
  419. [1]=>
  420. &string(5) "new.4"
  421. [2]=>
  422. string(5) "new.3"
  423. [3]=>
  424. string(5) "new.2"
  425. [4]=>
  426. string(5) "new.1"
  427. [5]=>
  428. string(5) "new.0"
  429. [6]=>
  430. string(3) "v.0"
  431. [7]=>
  432. string(3) "v.1"
  433. }
  434. ---( Array with 3 element(s): )---
  435. --> State of array before loop:
  436. array(3) {
  437. [0]=>
  438. string(3) "v.0"
  439. [1]=>
  440. string(3) "v.1"
  441. [2]=>
  442. string(3) "v.2"
  443. }
  444. --> Do loop:
  445. iteration 0: $k=0; $v=v.0
  446. iteration 1: $k=0; $v=new.0
  447. iteration 2: $k=0; $v=new.1
  448. iteration 3: $k=0; $v=new.2
  449. iteration 4: $k=0; $v=new.3
  450. iteration 5: $k=0; $v=new.4
  451. ** Stuck in a loop! **
  452. --> State of array after loop:
  453. array(9) {
  454. [0]=>
  455. string(5) "new.5"
  456. [1]=>
  457. &string(5) "new.4"
  458. [2]=>
  459. string(5) "new.3"
  460. [3]=>
  461. string(5) "new.2"
  462. [4]=>
  463. string(5) "new.1"
  464. [5]=>
  465. string(5) "new.0"
  466. [6]=>
  467. string(3) "v.0"
  468. [7]=>
  469. string(3) "v.1"
  470. [8]=>
  471. string(3) "v.2"
  472. }
  473. ---( Array with 4 element(s): )---
  474. --> State of array before loop:
  475. array(4) {
  476. [0]=>
  477. string(3) "v.0"
  478. [1]=>
  479. string(3) "v.1"
  480. [2]=>
  481. string(3) "v.2"
  482. [3]=>
  483. string(3) "v.3"
  484. }
  485. --> Do loop:
  486. iteration 0: $k=0; $v=v.0
  487. iteration 1: $k=0; $v=new.0
  488. iteration 2: $k=0; $v=new.1
  489. iteration 3: $k=0; $v=new.2
  490. iteration 4: $k=0; $v=new.3
  491. iteration 5: $k=0; $v=new.4
  492. ** Stuck in a loop! **
  493. --> State of array after loop:
  494. array(10) {
  495. [0]=>
  496. string(5) "new.5"
  497. [1]=>
  498. &string(5) "new.4"
  499. [2]=>
  500. string(5) "new.3"
  501. [3]=>
  502. string(5) "new.2"
  503. [4]=>
  504. string(5) "new.1"
  505. [5]=>
  506. string(5) "new.0"
  507. [6]=>
  508. string(3) "v.0"
  509. [7]=>
  510. string(3) "v.1"
  511. [8]=>
  512. string(3) "v.2"
  513. [9]=>
  514. string(3) "v.3"
  515. }