1--TEST-- 2Directly modifying an unreferenced array when foreach'ing over it while using &$value syntax. 3--FILE-- 4<?php 5 6define('MAX_LOOPS',5); 7 8function withRefValue($elements, $transform) { 9 echo "\n---( Array with $elements element(s): )---\n"; 10 //Build array: 11 for ($i=0; $i<$elements; $i++) { 12 $a[] = "v.$i"; 13 } 14 $counter=0; 15 16 echo "--> State of array before loop:\n"; 17 var_dump($a); 18 19 echo "--> Do loop:\n"; 20 foreach ($a as $k=>&$v) { 21 echo " iteration $counter: \$k=$k; \$v=$v\n"; 22 eval($transform); 23 $counter++; 24 if ($counter>MAX_LOOPS) { 25 echo " ** Stuck in a loop! **\n"; 26 break; 27 } 28 } 29 30 echo "--> State of array after loop:\n"; 31 var_dump($a); 32} 33 34 35echo "\nPopping elements off end of an unreferenced array, using &\$value."; 36$transform = 'array_pop($a);'; 37withRefValue(1, $transform); 38withRefValue(2, $transform); 39withRefValue(3, $transform); 40withRefValue(4, $transform); 41 42echo "\n\n\nShift elements off start of an unreferenced array, using &\$value."; 43$transform = 'array_shift($a);'; 44withRefValue(1, $transform); 45withRefValue(2, $transform); 46withRefValue(3, $transform); 47withRefValue(4, $transform); 48 49echo "\n\n\nRemove current element of an unreferenced array, using &\$value."; 50$transform = 'unset($a[$k]);'; 51withRefValue(1, $transform); 52withRefValue(2, $transform); 53withRefValue(3, $transform); 54withRefValue(4, $transform); 55 56echo "\n\n\nAdding elements to the end of an unreferenced array, using &\$value."; 57$transform = 'array_push($a, "new.$counter");'; 58withRefValue(1, $transform); 59withRefValue(2, $transform); 60withRefValue(3, $transform); 61withRefValue(4, $transform); 62 63echo "\n\n\nAdding elements to the start of an unreferenced array, using &\$value."; 64$transform = 'array_unshift($a, "new.$counter");'; 65withRefValue(1, $transform); 66withRefValue(2, $transform); 67withRefValue(3, $transform); 68withRefValue(4, $transform); 69 70?> 71--EXPECT-- 72 73Popping elements off end of an unreferenced array, using &$value. 74---( Array with 1 element(s): )--- 75--> State of array before loop: 76array(1) { 77 [0]=> 78 string(3) "v.0" 79} 80--> Do loop: 81 iteration 0: $k=0; $v=v.0 82--> State of array after loop: 83array(0) { 84} 85 86---( Array with 2 element(s): )--- 87--> State of array before loop: 88array(2) { 89 [0]=> 90 string(3) "v.0" 91 [1]=> 92 string(3) "v.1" 93} 94--> Do loop: 95 iteration 0: $k=0; $v=v.0 96--> State of array after loop: 97array(1) { 98 [0]=> 99 &string(3) "v.0" 100} 101 102---( Array with 3 element(s): )--- 103--> State of array before loop: 104array(3) { 105 [0]=> 106 string(3) "v.0" 107 [1]=> 108 string(3) "v.1" 109 [2]=> 110 string(3) "v.2" 111} 112--> Do loop: 113 iteration 0: $k=0; $v=v.0 114 iteration 1: $k=1; $v=v.1 115--> State of array after loop: 116array(1) { 117 [0]=> 118 string(3) "v.0" 119} 120 121---( Array with 4 element(s): )--- 122--> State of array before loop: 123array(4) { 124 [0]=> 125 string(3) "v.0" 126 [1]=> 127 string(3) "v.1" 128 [2]=> 129 string(3) "v.2" 130 [3]=> 131 string(3) "v.3" 132} 133--> Do loop: 134 iteration 0: $k=0; $v=v.0 135 iteration 1: $k=1; $v=v.1 136--> State of array after loop: 137array(2) { 138 [0]=> 139 string(3) "v.0" 140 [1]=> 141 &string(3) "v.1" 142} 143 144 145 146Shift elements off start of an unreferenced array, using &$value. 147---( Array with 1 element(s): )--- 148--> State of array before loop: 149array(1) { 150 [0]=> 151 string(3) "v.0" 152} 153--> Do loop: 154 iteration 0: $k=0; $v=v.0 155--> State of array after loop: 156array(0) { 157} 158 159---( Array with 2 element(s): )--- 160--> State of array before loop: 161array(2) { 162 [0]=> 163 string(3) "v.0" 164 [1]=> 165 string(3) "v.1" 166} 167--> Do loop: 168 iteration 0: $k=0; $v=v.0 169 iteration 1: $k=0; $v=v.1 170--> State of array after loop: 171array(0) { 172} 173 174---( Array with 3 element(s): )--- 175--> State of array before loop: 176array(3) { 177 [0]=> 178 string(3) "v.0" 179 [1]=> 180 string(3) "v.1" 181 [2]=> 182 string(3) "v.2" 183} 184--> Do loop: 185 iteration 0: $k=0; $v=v.0 186 iteration 1: $k=0; $v=v.1 187 iteration 2: $k=0; $v=v.2 188--> State of array after loop: 189array(0) { 190} 191 192---( Array with 4 element(s): )--- 193--> State of array before loop: 194array(4) { 195 [0]=> 196 string(3) "v.0" 197 [1]=> 198 string(3) "v.1" 199 [2]=> 200 string(3) "v.2" 201 [3]=> 202 string(3) "v.3" 203} 204--> Do loop: 205 iteration 0: $k=0; $v=v.0 206 iteration 1: $k=0; $v=v.1 207 iteration 2: $k=0; $v=v.2 208 iteration 3: $k=0; $v=v.3 209--> State of array after loop: 210array(0) { 211} 212 213 214 215Remove current element of an unreferenced array, using &$value. 216---( Array with 1 element(s): )--- 217--> State of array before loop: 218array(1) { 219 [0]=> 220 string(3) "v.0" 221} 222--> Do loop: 223 iteration 0: $k=0; $v=v.0 224--> State of array after loop: 225array(0) { 226} 227 228---( Array with 2 element(s): )--- 229--> State of array before loop: 230array(2) { 231 [0]=> 232 string(3) "v.0" 233 [1]=> 234 string(3) "v.1" 235} 236--> Do loop: 237 iteration 0: $k=0; $v=v.0 238 iteration 1: $k=1; $v=v.1 239--> State of array after loop: 240array(0) { 241} 242 243---( Array with 3 element(s): )--- 244--> State of array before loop: 245array(3) { 246 [0]=> 247 string(3) "v.0" 248 [1]=> 249 string(3) "v.1" 250 [2]=> 251 string(3) "v.2" 252} 253--> Do loop: 254 iteration 0: $k=0; $v=v.0 255 iteration 1: $k=1; $v=v.1 256 iteration 2: $k=2; $v=v.2 257--> State of array after loop: 258array(0) { 259} 260 261---( Array with 4 element(s): )--- 262--> State of array before loop: 263array(4) { 264 [0]=> 265 string(3) "v.0" 266 [1]=> 267 string(3) "v.1" 268 [2]=> 269 string(3) "v.2" 270 [3]=> 271 string(3) "v.3" 272} 273--> Do loop: 274 iteration 0: $k=0; $v=v.0 275 iteration 1: $k=1; $v=v.1 276 iteration 2: $k=2; $v=v.2 277 iteration 3: $k=3; $v=v.3 278--> State of array after loop: 279array(0) { 280} 281 282 283 284Adding elements to the end of an unreferenced array, using &$value. 285---( Array with 1 element(s): )--- 286--> State of array before loop: 287array(1) { 288 [0]=> 289 string(3) "v.0" 290} 291--> Do loop: 292 iteration 0: $k=0; $v=v.0 293 iteration 1: $k=1; $v=new.0 294 iteration 2: $k=2; $v=new.1 295 iteration 3: $k=3; $v=new.2 296 iteration 4: $k=4; $v=new.3 297 iteration 5: $k=5; $v=new.4 298 ** Stuck in a loop! ** 299--> State of array after loop: 300array(7) { 301 [0]=> 302 string(3) "v.0" 303 [1]=> 304 string(5) "new.0" 305 [2]=> 306 string(5) "new.1" 307 [3]=> 308 string(5) "new.2" 309 [4]=> 310 string(5) "new.3" 311 [5]=> 312 &string(5) "new.4" 313 [6]=> 314 string(5) "new.5" 315} 316 317---( Array with 2 element(s): )--- 318--> State of array before loop: 319array(2) { 320 [0]=> 321 string(3) "v.0" 322 [1]=> 323 string(3) "v.1" 324} 325--> Do loop: 326 iteration 0: $k=0; $v=v.0 327 iteration 1: $k=1; $v=v.1 328 iteration 2: $k=2; $v=new.0 329 iteration 3: $k=3; $v=new.1 330 iteration 4: $k=4; $v=new.2 331 iteration 5: $k=5; $v=new.3 332 ** Stuck in a loop! ** 333--> State of array after loop: 334array(8) { 335 [0]=> 336 string(3) "v.0" 337 [1]=> 338 string(3) "v.1" 339 [2]=> 340 string(5) "new.0" 341 [3]=> 342 string(5) "new.1" 343 [4]=> 344 string(5) "new.2" 345 [5]=> 346 &string(5) "new.3" 347 [6]=> 348 string(5) "new.4" 349 [7]=> 350 string(5) "new.5" 351} 352 353---( Array with 3 element(s): )--- 354--> State of array before loop: 355array(3) { 356 [0]=> 357 string(3) "v.0" 358 [1]=> 359 string(3) "v.1" 360 [2]=> 361 string(3) "v.2" 362} 363--> Do loop: 364 iteration 0: $k=0; $v=v.0 365 iteration 1: $k=1; $v=v.1 366 iteration 2: $k=2; $v=v.2 367 iteration 3: $k=3; $v=new.0 368 iteration 4: $k=4; $v=new.1 369 iteration 5: $k=5; $v=new.2 370 ** Stuck in a loop! ** 371--> State of array after loop: 372array(9) { 373 [0]=> 374 string(3) "v.0" 375 [1]=> 376 string(3) "v.1" 377 [2]=> 378 string(3) "v.2" 379 [3]=> 380 string(5) "new.0" 381 [4]=> 382 string(5) "new.1" 383 [5]=> 384 &string(5) "new.2" 385 [6]=> 386 string(5) "new.3" 387 [7]=> 388 string(5) "new.4" 389 [8]=> 390 string(5) "new.5" 391} 392 393---( Array with 4 element(s): )--- 394--> State of array before loop: 395array(4) { 396 [0]=> 397 string(3) "v.0" 398 [1]=> 399 string(3) "v.1" 400 [2]=> 401 string(3) "v.2" 402 [3]=> 403 string(3) "v.3" 404} 405--> Do loop: 406 iteration 0: $k=0; $v=v.0 407 iteration 1: $k=1; $v=v.1 408 iteration 2: $k=2; $v=v.2 409 iteration 3: $k=3; $v=v.3 410 iteration 4: $k=4; $v=new.0 411 iteration 5: $k=5; $v=new.1 412 ** Stuck in a loop! ** 413--> State of array after loop: 414array(10) { 415 [0]=> 416 string(3) "v.0" 417 [1]=> 418 string(3) "v.1" 419 [2]=> 420 string(3) "v.2" 421 [3]=> 422 string(3) "v.3" 423 [4]=> 424 string(5) "new.0" 425 [5]=> 426 &string(5) "new.1" 427 [6]=> 428 string(5) "new.2" 429 [7]=> 430 string(5) "new.3" 431 [8]=> 432 string(5) "new.4" 433 [9]=> 434 string(5) "new.5" 435} 436 437 438 439Adding elements to the start of an unreferenced array, using &$value. 440---( Array with 1 element(s): )--- 441--> State of array before loop: 442array(1) { 443 [0]=> 444 string(3) "v.0" 445} 446--> Do loop: 447 iteration 0: $k=0; $v=v.0 448--> State of array after loop: 449array(2) { 450 [0]=> 451 string(5) "new.0" 452 [1]=> 453 &string(3) "v.0" 454} 455 456---( Array with 2 element(s): )--- 457--> State of array before loop: 458array(2) { 459 [0]=> 460 string(3) "v.0" 461 [1]=> 462 string(3) "v.1" 463} 464--> Do loop: 465 iteration 0: $k=0; $v=v.0 466 iteration 1: $k=2; $v=v.1 467--> State of array after loop: 468array(4) { 469 [0]=> 470 string(5) "new.1" 471 [1]=> 472 string(5) "new.0" 473 [2]=> 474 string(3) "v.0" 475 [3]=> 476 &string(3) "v.1" 477} 478 479---( Array with 3 element(s): )--- 480--> State of array before loop: 481array(3) { 482 [0]=> 483 string(3) "v.0" 484 [1]=> 485 string(3) "v.1" 486 [2]=> 487 string(3) "v.2" 488} 489--> Do loop: 490 iteration 0: $k=0; $v=v.0 491 iteration 1: $k=3; $v=v.2 492--> State of array after loop: 493array(5) { 494 [0]=> 495 string(5) "new.1" 496 [1]=> 497 string(5) "new.0" 498 [2]=> 499 string(3) "v.0" 500 [3]=> 501 string(3) "v.1" 502 [4]=> 503 &string(3) "v.2" 504} 505 506---( Array with 4 element(s): )--- 507--> State of array before loop: 508array(4) { 509 [0]=> 510 string(3) "v.0" 511 [1]=> 512 string(3) "v.1" 513 [2]=> 514 string(3) "v.2" 515 [3]=> 516 string(3) "v.3" 517} 518--> Do loop: 519 iteration 0: $k=0; $v=v.0 520 iteration 1: $k=4; $v=v.3 521--> State of array after loop: 522array(6) { 523 [0]=> 524 string(5) "new.1" 525 [1]=> 526 string(5) "new.0" 527 [2]=> 528 string(3) "v.0" 529 [3]=> 530 string(3) "v.1" 531 [4]=> 532 string(3) "v.2" 533 [5]=> 534 &string(3) "v.3" 535} 536