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