Почему?
Это может пролить некоторый свет на это, однако я не совсем уверен, так ли это. По крайней мере, в этом есть какой-то смысл:
Если вы используете &$foo
, вы хотите присвоить псевдоним каждому значению итерации. Но когда вы приводите массив, он не существует как значение, PHP не может создать для него псевдоним (или, по крайней мере, это не имеет смысла).
Вместо того, чтобы:
foreach ((array)$arr['subarr'] as &$foo)
сделайте это, что работает и может быть тем, что вы ищете:
$subarray = (array) $arr['subarr'];
foreach ($subarray as &$foo)
или
$arr['subarr'] = (array) $arr['subarr'];
foreach ($arr['subarr'] as &$foo)