Читайте официальную документацию по переезду, там всё написано.
php.net/manual/en/migration70.incompatible.php
А именно, по вашему вопросу про foreach:
foreach by-value operates on a copy of the array
When used in the default by-value mode, foreach will now operate on a copy of the array being iterated rather than the array itself. This means that changes to the array made during iteration will not affect the values that are iterated.
Перевод: в режиме foreach($arr as $v) - движок сначала сделает копию массива и будет проводить итерацию по копии. Даже если во время цикла вы сделаете $arr = [], то цикл всё равно пробежит до конца исходного массива, по всем элементам.
То есть код теперь эквивалентен такому:
$arr_copy = $arr;
foreach($arr_copy as $k=>$v) {
...
}
за тем исключением, что к переменной $arr_copy вы не имеете прямого доступа.
Это не значит, что переменная $arr внутри цикла начинает ссылаться на копию. Поэтому Ваш код будет работать.
Вот если бы вы работали в цикле не только с текущим элементом, а например, и со следующими относительно текущего, изменяя или удаляя их, тогда поведение программы изменилось бы. Но я никогда не встречал подобного использования цикла foreach.