foreachLoop.012.phpt 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. --TEST--
  2. Directly modifying an unreferenced array when foreach'ing over it.
  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";
  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";
  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";
  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";
  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";
  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
  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=1; $v=v.1
  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. iteration 2: $k=2; $v=v.2
  100. --> State of array after loop:
  101. array(0) {
  102. }
  103. ---( Array with 4 element(s): )---
  104. --> State of array before loop:
  105. array(4) {
  106. [0]=>
  107. string(3) "v.0"
  108. [1]=>
  109. string(3) "v.1"
  110. [2]=>
  111. string(3) "v.2"
  112. [3]=>
  113. string(3) "v.3"
  114. }
  115. --> Do loop:
  116. iteration 0: $k=0; $v=v.0
  117. iteration 1: $k=1; $v=v.1
  118. iteration 2: $k=2; $v=v.2
  119. iteration 3: $k=3; $v=v.3
  120. --> State of array after loop:
  121. array(0) {
  122. }
  123. Shift elements off start of an unreferenced array
  124. ---( Array with 1 element(s): )---
  125. --> State of array before loop:
  126. array(1) {
  127. [0]=>
  128. string(3) "v.0"
  129. }
  130. --> Do loop:
  131. iteration 0: $k=0; $v=v.0
  132. --> State of array after loop:
  133. array(0) {
  134. }
  135. ---( Array with 2 element(s): )---
  136. --> State of array before loop:
  137. array(2) {
  138. [0]=>
  139. string(3) "v.0"
  140. [1]=>
  141. string(3) "v.1"
  142. }
  143. --> Do loop:
  144. iteration 0: $k=0; $v=v.0
  145. iteration 1: $k=1; $v=v.1
  146. --> State of array after loop:
  147. array(0) {
  148. }
  149. ---( Array with 3 element(s): )---
  150. --> State of array before loop:
  151. array(3) {
  152. [0]=>
  153. string(3) "v.0"
  154. [1]=>
  155. string(3) "v.1"
  156. [2]=>
  157. string(3) "v.2"
  158. }
  159. --> Do loop:
  160. iteration 0: $k=0; $v=v.0
  161. iteration 1: $k=1; $v=v.1
  162. iteration 2: $k=2; $v=v.2
  163. --> State of array after loop:
  164. array(0) {
  165. }
  166. ---( Array with 4 element(s): )---
  167. --> State of array before loop:
  168. array(4) {
  169. [0]=>
  170. string(3) "v.0"
  171. [1]=>
  172. string(3) "v.1"
  173. [2]=>
  174. string(3) "v.2"
  175. [3]=>
  176. string(3) "v.3"
  177. }
  178. --> Do loop:
  179. iteration 0: $k=0; $v=v.0
  180. iteration 1: $k=1; $v=v.1
  181. iteration 2: $k=2; $v=v.2
  182. iteration 3: $k=3; $v=v.3
  183. --> State of array after loop:
  184. array(0) {
  185. }
  186. Remove current element of an unreferenced array
  187. ---( Array with 1 element(s): )---
  188. --> State of array before loop:
  189. array(1) {
  190. [0]=>
  191. string(3) "v.0"
  192. }
  193. --> Do loop:
  194. iteration 0: $k=0; $v=v.0
  195. --> State of array after loop:
  196. array(0) {
  197. }
  198. ---( Array with 2 element(s): )---
  199. --> State of array before loop:
  200. array(2) {
  201. [0]=>
  202. string(3) "v.0"
  203. [1]=>
  204. string(3) "v.1"
  205. }
  206. --> Do loop:
  207. iteration 0: $k=0; $v=v.0
  208. iteration 1: $k=1; $v=v.1
  209. --> State of array after loop:
  210. array(0) {
  211. }
  212. ---( Array with 3 element(s): )---
  213. --> State of array before loop:
  214. array(3) {
  215. [0]=>
  216. string(3) "v.0"
  217. [1]=>
  218. string(3) "v.1"
  219. [2]=>
  220. string(3) "v.2"
  221. }
  222. --> Do loop:
  223. iteration 0: $k=0; $v=v.0
  224. iteration 1: $k=1; $v=v.1
  225. iteration 2: $k=2; $v=v.2
  226. --> State of array after loop:
  227. array(0) {
  228. }
  229. ---( Array with 4 element(s): )---
  230. --> State of array before loop:
  231. array(4) {
  232. [0]=>
  233. string(3) "v.0"
  234. [1]=>
  235. string(3) "v.1"
  236. [2]=>
  237. string(3) "v.2"
  238. [3]=>
  239. string(3) "v.3"
  240. }
  241. --> Do loop:
  242. iteration 0: $k=0; $v=v.0
  243. iteration 1: $k=1; $v=v.1
  244. iteration 2: $k=2; $v=v.2
  245. iteration 3: $k=3; $v=v.3
  246. --> State of array after loop:
  247. array(0) {
  248. }
  249. Adding elements to the end of an unreferenced array
  250. ---( Array with 1 element(s): )---
  251. --> State of array before loop:
  252. array(1) {
  253. [0]=>
  254. string(3) "v.0"
  255. }
  256. --> Do loop:
  257. iteration 0: $k=0; $v=v.0
  258. --> State of array after loop:
  259. array(2) {
  260. [0]=>
  261. string(3) "v.0"
  262. [1]=>
  263. string(5) "new.0"
  264. }
  265. ---( Array with 2 element(s): )---
  266. --> State of array before loop:
  267. array(2) {
  268. [0]=>
  269. string(3) "v.0"
  270. [1]=>
  271. string(3) "v.1"
  272. }
  273. --> Do loop:
  274. iteration 0: $k=0; $v=v.0
  275. iteration 1: $k=1; $v=v.1
  276. --> State of array after loop:
  277. array(4) {
  278. [0]=>
  279. string(3) "v.0"
  280. [1]=>
  281. string(3) "v.1"
  282. [2]=>
  283. string(5) "new.0"
  284. [3]=>
  285. string(5) "new.1"
  286. }
  287. ---( Array with 3 element(s): )---
  288. --> State of array before loop:
  289. array(3) {
  290. [0]=>
  291. string(3) "v.0"
  292. [1]=>
  293. string(3) "v.1"
  294. [2]=>
  295. string(3) "v.2"
  296. }
  297. --> Do loop:
  298. iteration 0: $k=0; $v=v.0
  299. iteration 1: $k=1; $v=v.1
  300. iteration 2: $k=2; $v=v.2
  301. --> State of array after loop:
  302. array(6) {
  303. [0]=>
  304. string(3) "v.0"
  305. [1]=>
  306. string(3) "v.1"
  307. [2]=>
  308. string(3) "v.2"
  309. [3]=>
  310. string(5) "new.0"
  311. [4]=>
  312. string(5) "new.1"
  313. [5]=>
  314. string(5) "new.2"
  315. }
  316. ---( Array with 4 element(s): )---
  317. --> State of array before loop:
  318. array(4) {
  319. [0]=>
  320. string(3) "v.0"
  321. [1]=>
  322. string(3) "v.1"
  323. [2]=>
  324. string(3) "v.2"
  325. [3]=>
  326. string(3) "v.3"
  327. }
  328. --> Do loop:
  329. iteration 0: $k=0; $v=v.0
  330. iteration 1: $k=1; $v=v.1
  331. iteration 2: $k=2; $v=v.2
  332. iteration 3: $k=3; $v=v.3
  333. --> State of array after loop:
  334. array(8) {
  335. [0]=>
  336. string(3) "v.0"
  337. [1]=>
  338. string(3) "v.1"
  339. [2]=>
  340. string(3) "v.2"
  341. [3]=>
  342. string(3) "v.3"
  343. [4]=>
  344. string(5) "new.0"
  345. [5]=>
  346. string(5) "new.1"
  347. [6]=>
  348. string(5) "new.2"
  349. [7]=>
  350. string(5) "new.3"
  351. }
  352. Adding elements to the start of an unreferenced array
  353. ---( Array with 1 element(s): )---
  354. --> State of array before loop:
  355. array(1) {
  356. [0]=>
  357. string(3) "v.0"
  358. }
  359. --> Do loop:
  360. iteration 0: $k=0; $v=v.0
  361. --> State of array after loop:
  362. array(2) {
  363. [0]=>
  364. string(5) "new.0"
  365. [1]=>
  366. string(3) "v.0"
  367. }
  368. ---( Array with 2 element(s): )---
  369. --> State of array before loop:
  370. array(2) {
  371. [0]=>
  372. string(3) "v.0"
  373. [1]=>
  374. string(3) "v.1"
  375. }
  376. --> Do loop:
  377. iteration 0: $k=0; $v=v.0
  378. iteration 1: $k=1; $v=v.1
  379. --> State of array after loop:
  380. array(4) {
  381. [0]=>
  382. string(5) "new.1"
  383. [1]=>
  384. string(5) "new.0"
  385. [2]=>
  386. string(3) "v.0"
  387. [3]=>
  388. string(3) "v.1"
  389. }
  390. ---( Array with 3 element(s): )---
  391. --> State of array before loop:
  392. array(3) {
  393. [0]=>
  394. string(3) "v.0"
  395. [1]=>
  396. string(3) "v.1"
  397. [2]=>
  398. string(3) "v.2"
  399. }
  400. --> Do loop:
  401. iteration 0: $k=0; $v=v.0
  402. iteration 1: $k=1; $v=v.1
  403. iteration 2: $k=2; $v=v.2
  404. --> State of array after loop:
  405. array(6) {
  406. [0]=>
  407. string(5) "new.2"
  408. [1]=>
  409. string(5) "new.1"
  410. [2]=>
  411. string(5) "new.0"
  412. [3]=>
  413. string(3) "v.0"
  414. [4]=>
  415. string(3) "v.1"
  416. [5]=>
  417. string(3) "v.2"
  418. }
  419. ---( Array with 4 element(s): )---
  420. --> State of array before loop:
  421. array(4) {
  422. [0]=>
  423. string(3) "v.0"
  424. [1]=>
  425. string(3) "v.1"
  426. [2]=>
  427. string(3) "v.2"
  428. [3]=>
  429. string(3) "v.3"
  430. }
  431. --> Do loop:
  432. iteration 0: $k=0; $v=v.0
  433. iteration 1: $k=1; $v=v.1
  434. iteration 2: $k=2; $v=v.2
  435. iteration 3: $k=3; $v=v.3
  436. --> State of array after loop:
  437. array(8) {
  438. [0]=>
  439. string(5) "new.3"
  440. [1]=>
  441. string(5) "new.2"
  442. [2]=>
  443. string(5) "new.1"
  444. [3]=>
  445. string(5) "new.0"
  446. [4]=>
  447. string(3) "v.0"
  448. [5]=>
  449. string(3) "v.1"
  450. [6]=>
  451. string(3) "v.2"
  452. [7]=>
  453. string(3) "v.3"
  454. }