foreachLoop.014.phpt 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. --TEST--
  2. Directly modifying a REFERENCED 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. $ref = &$a;
  14. echo "--> State of referenced array before loop:\n";
  15. var_dump($a);
  16. echo "--> Do loop:\n";
  17. foreach ($a as $k=>$v) {
  18. echo " iteration $counter: \$k=$k; \$v=$v\n";
  19. eval($transform);
  20. $counter++;
  21. if ($counter>MAX_LOOPS) {
  22. echo " ** Stuck in a loop! **\n";
  23. break;
  24. }
  25. }
  26. echo "--> State of array after loop:\n";
  27. var_dump($a);
  28. }
  29. echo "\nPopping elements off end of a referenced array";
  30. $transform = 'array_pop($a);';
  31. withRefValue(1, $transform);
  32. withRefValue(2, $transform);
  33. withRefValue(3, $transform);
  34. withRefValue(4, $transform);
  35. echo "\n\n\nShift elements off start of a referenced array";
  36. $transform = 'array_shift($a);';
  37. withRefValue(1, $transform);
  38. withRefValue(2, $transform);
  39. withRefValue(3, $transform);
  40. withRefValue(4, $transform);
  41. echo "\n\n\nRemove current element of a referenced array";
  42. $transform = 'unset($a[$k]);';
  43. withRefValue(1, $transform);
  44. withRefValue(2, $transform);
  45. withRefValue(3, $transform);
  46. withRefValue(4, $transform);
  47. echo "\n\n\nAdding elements to the end of a referenced array";
  48. $transform = 'array_push($a, "new.$counter");';
  49. withRefValue(1, $transform);
  50. withRefValue(2, $transform);
  51. withRefValue(3, $transform);
  52. withRefValue(4, $transform);
  53. echo "\n\n\nAdding elements to the start of a referenced array";
  54. $transform = 'array_unshift($a, "new.$counter");';
  55. withRefValue(1, $transform);
  56. withRefValue(2, $transform);
  57. withRefValue(3, $transform);
  58. withRefValue(4, $transform);
  59. ?>
  60. --EXPECT--
  61. Popping elements off end of a referenced array
  62. ---( Array with 1 element(s): )---
  63. --> State of referenced array before loop:
  64. array(1) {
  65. [0]=>
  66. string(3) "v.0"
  67. }
  68. --> Do loop:
  69. iteration 0: $k=0; $v=v.0
  70. --> State of array after loop:
  71. array(0) {
  72. }
  73. ---( Array with 2 element(s): )---
  74. --> State of referenced array before loop:
  75. array(2) {
  76. [0]=>
  77. string(3) "v.0"
  78. [1]=>
  79. string(3) "v.1"
  80. }
  81. --> Do loop:
  82. iteration 0: $k=0; $v=v.0
  83. iteration 1: $k=1; $v=v.1
  84. --> State of array after loop:
  85. array(0) {
  86. }
  87. ---( Array with 3 element(s): )---
  88. --> State of referenced 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. iteration 2: $k=2; $v=v.2
  101. --> State of array after loop:
  102. array(0) {
  103. }
  104. ---( Array with 4 element(s): )---
  105. --> State of referenced 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=2; $v=v.2
  120. iteration 3: $k=3; $v=v.3
  121. --> State of array after loop:
  122. array(0) {
  123. }
  124. Shift elements off start of a referenced array
  125. ---( Array with 1 element(s): )---
  126. --> State of referenced 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 referenced 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=1; $v=v.1
  147. --> State of array after loop:
  148. array(0) {
  149. }
  150. ---( Array with 3 element(s): )---
  151. --> State of referenced 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=1; $v=v.1
  163. iteration 2: $k=2; $v=v.2
  164. --> State of array after loop:
  165. array(0) {
  166. }
  167. ---( Array with 4 element(s): )---
  168. --> State of referenced 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=1; $v=v.1
  182. iteration 2: $k=2; $v=v.2
  183. iteration 3: $k=3; $v=v.3
  184. --> State of array after loop:
  185. array(0) {
  186. }
  187. Remove current element of a referenced array
  188. ---( Array with 1 element(s): )---
  189. --> State of referenced 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 referenced 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 referenced 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 referenced 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 a referenced array
  251. ---( Array with 1 element(s): )---
  252. --> State of referenced 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 referenced 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. --> State of array after loop:
  278. array(4) {
  279. [0]=>
  280. string(3) "v.0"
  281. [1]=>
  282. string(3) "v.1"
  283. [2]=>
  284. string(5) "new.0"
  285. [3]=>
  286. string(5) "new.1"
  287. }
  288. ---( Array with 3 element(s): )---
  289. --> State of referenced array before loop:
  290. array(3) {
  291. [0]=>
  292. string(3) "v.0"
  293. [1]=>
  294. string(3) "v.1"
  295. [2]=>
  296. string(3) "v.2"
  297. }
  298. --> Do loop:
  299. iteration 0: $k=0; $v=v.0
  300. iteration 1: $k=1; $v=v.1
  301. iteration 2: $k=2; $v=v.2
  302. --> State of array after loop:
  303. array(6) {
  304. [0]=>
  305. string(3) "v.0"
  306. [1]=>
  307. string(3) "v.1"
  308. [2]=>
  309. string(3) "v.2"
  310. [3]=>
  311. string(5) "new.0"
  312. [4]=>
  313. string(5) "new.1"
  314. [5]=>
  315. string(5) "new.2"
  316. }
  317. ---( Array with 4 element(s): )---
  318. --> State of referenced array before loop:
  319. array(4) {
  320. [0]=>
  321. string(3) "v.0"
  322. [1]=>
  323. string(3) "v.1"
  324. [2]=>
  325. string(3) "v.2"
  326. [3]=>
  327. string(3) "v.3"
  328. }
  329. --> Do loop:
  330. iteration 0: $k=0; $v=v.0
  331. iteration 1: $k=1; $v=v.1
  332. iteration 2: $k=2; $v=v.2
  333. iteration 3: $k=3; $v=v.3
  334. --> State of array after loop:
  335. array(8) {
  336. [0]=>
  337. string(3) "v.0"
  338. [1]=>
  339. string(3) "v.1"
  340. [2]=>
  341. string(3) "v.2"
  342. [3]=>
  343. string(3) "v.3"
  344. [4]=>
  345. string(5) "new.0"
  346. [5]=>
  347. string(5) "new.1"
  348. [6]=>
  349. string(5) "new.2"
  350. [7]=>
  351. string(5) "new.3"
  352. }
  353. Adding elements to the start of a referenced array
  354. ---( Array with 1 element(s): )---
  355. --> State of referenced array before loop:
  356. array(1) {
  357. [0]=>
  358. string(3) "v.0"
  359. }
  360. --> Do loop:
  361. iteration 0: $k=0; $v=v.0
  362. --> State of array after loop:
  363. array(2) {
  364. [0]=>
  365. string(5) "new.0"
  366. [1]=>
  367. string(3) "v.0"
  368. }
  369. ---( Array with 2 element(s): )---
  370. --> State of referenced array before loop:
  371. array(2) {
  372. [0]=>
  373. string(3) "v.0"
  374. [1]=>
  375. string(3) "v.1"
  376. }
  377. --> Do loop:
  378. iteration 0: $k=0; $v=v.0
  379. iteration 1: $k=1; $v=v.1
  380. --> State of array after loop:
  381. array(4) {
  382. [0]=>
  383. string(5) "new.1"
  384. [1]=>
  385. string(5) "new.0"
  386. [2]=>
  387. string(3) "v.0"
  388. [3]=>
  389. string(3) "v.1"
  390. }
  391. ---( Array with 3 element(s): )---
  392. --> State of referenced array before loop:
  393. array(3) {
  394. [0]=>
  395. string(3) "v.0"
  396. [1]=>
  397. string(3) "v.1"
  398. [2]=>
  399. string(3) "v.2"
  400. }
  401. --> Do loop:
  402. iteration 0: $k=0; $v=v.0
  403. iteration 1: $k=1; $v=v.1
  404. iteration 2: $k=2; $v=v.2
  405. --> State of array after loop:
  406. array(6) {
  407. [0]=>
  408. string(5) "new.2"
  409. [1]=>
  410. string(5) "new.1"
  411. [2]=>
  412. string(5) "new.0"
  413. [3]=>
  414. string(3) "v.0"
  415. [4]=>
  416. string(3) "v.1"
  417. [5]=>
  418. string(3) "v.2"
  419. }
  420. ---( Array with 4 element(s): )---
  421. --> State of referenced array before loop:
  422. array(4) {
  423. [0]=>
  424. string(3) "v.0"
  425. [1]=>
  426. string(3) "v.1"
  427. [2]=>
  428. string(3) "v.2"
  429. [3]=>
  430. string(3) "v.3"
  431. }
  432. --> Do loop:
  433. iteration 0: $k=0; $v=v.0
  434. iteration 1: $k=1; $v=v.1
  435. iteration 2: $k=2; $v=v.2
  436. iteration 3: $k=3; $v=v.3
  437. --> State of array after loop:
  438. array(8) {
  439. [0]=>
  440. string(5) "new.3"
  441. [1]=>
  442. string(5) "new.2"
  443. [2]=>
  444. string(5) "new.1"
  445. [3]=>
  446. string(5) "new.0"
  447. [4]=>
  448. string(3) "v.0"
  449. [5]=>
  450. string(3) "v.1"
  451. [6]=>
  452. string(3) "v.2"
  453. [7]=>
  454. string(3) "v.3"
  455. }