foreachLoop.015.phpt 10.0 KB

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