PHP VERSION: 7.0.26

foreach_and_unset.php

<?php
// foreach behavior

echo "BEFORE assignment\n";
echo 
"-----------------\n";

$a = [123];
foreach (
$a as $v) {
    
printf("%2d\n"$v);
    unset(
$a[1]);
}
var_dump($a);

echo 
PHP_EOL;
echo 
"AFTER assignment\n";
echo 
"----------------\n";

$a = [123];
// array pointer gets set to 1st element
$b = &$a;
foreach (
$a as $v) {
    
printf("%2d\n"$v);
    unset(
$a[1]);
}
var_dump($a);

/*
PHP 5.6
BEFORE assignment
-----------------
 1
 2
 3
array(2) {
  [0]=>
  int(1)
  [2]=>
  int(3)
}

AFTER assignment
----------------
 1
 3
array(2) {
  [0]=>
  int(1)
  [2]=>
  int(3)
}

PHP 7.0
BEFORE assignment
-----------------
 1
 2
 3
array(2) {
  [0] =>
  int(1)
  [2] =>
  int(3)
}

AFTER assignment
----------------
 1
 2
 3
array(2) {
  [0] =>
  int(1)
  [2] =>
  int(3)
}
*/


Output


BEFORE assignment
-----------------
 1
 2
 3
array(2) {
  [0]=>
  int(1)
  [2]=>
  int(3)
}

AFTER assignment
----------------
 1
 2
 3
array(2) {
  [0]=>
  int(1)
  [2]=>
  int(3)
}
SOURCE CODE