-- Это все так, но строго говоря тут(foreach ($item['item'] as $i)) i должна реинициализироваться.
не должна. Она объявлена выше. все соответствует логике php по видимости и области действия переменных
есть ЯП у которых да, область действия переменных объявленных в операторе for ограничена этим оператором.
но тогда нужен дополнительный код при выходе по break, если нам интересно на каком элементе был превран цикл.
-- а вот в реальном коде
не надо писать опасного, грязноватого кода.
есть много бест практик на эту тему, который автоматически застраховывает от таких проблем
1. что именно в массиве? вот и назовите $eachFoo, $itemFoo
2. не используйте повторно переменные для итерации в пределах файла, независимо от их области действия, чтобы при рефакторинге не появилась такая ошибка
3. разбивайте код на мелкие функции-методы (в данном случае модифицирующий foreach был бы в другой функции)
4. не используйте ссылочные переменные без надобности
5. называйте ссылочные переменные по особому, с каким-то префиксом или суффиксом.
-- выловить фичу(а на деле баг) оказывается не так просто и быстро
сейчас идет обсуждение другого опасного синтаксиса на эту теме
Код: Выделить всё
function foo(&args) { ... }
foo($myArray); // здесь никак не видно что мы передали по ссылке
думают как обязать указывать явно
чтобы не было такого
Код: Выделить всё
// была безопасная
function foo(args) { ... }
// стала опасная
function foo(&args) { ... }
а вызывающий код и "не знает" об этом ничего. и тем более о том что там внутри ему стали портить $myArray
и никаких бэст практик тут придумать не получится...
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.