foreachLoop.014.phpt 11 KB

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