Há alguma diferenciação entre escopos dentro de um laço foreach? Estou encontrando um comportamento inesperado no seguinte código:
<?php
function saque($conta,$saque){
    if($conta['saldo']>=$saque) {
        echo " - Sacado";
        $conta['saldo']-=$saque;
    }else
        echo ' - saldo insuficiente.';
    return $conta['saldo'];
};
$contas = [
    '022.011.333-12'=>[
        'nome'=>'Alberto',
        'saldo'=>500
    ],
    '356.722.8332-12'=>[
        'nome'=>'Julia',
        'saldo'=>200
    ],
    '963.720.639-08'=>[
        'nome'=>'Rodrigo',
        'saldo'=>8000
    ],
];
foreach ($contas as $cpf=>$conta){
    echo $cpf." - Nome: ".$conta['nome']." / Saldo R$: ".$conta['saldo'].PHP_EOL;
};
echo "------------------------------------------------------------------------".PHP_EOL;
foreach ($contas as $conta){
    echo "Iterado para ".$conta['nome'];
    $conta['saldo'] = saque($conta,500);
    echo " / Saldo: ".$conta['saldo'].PHP_EOL;
};
echo "------------------------------------------------------------------------".PHP_EOL;
foreach ($contas as $cpf=>$conta){
    echo $cpf." - Nome: ".$conta['nome']." / Saldo R$: ".$conta['saldo'].PHP_EOL;
};Onde, após a manipulação dos saldos, dentro do segundo laço, os valores 'resetam' para os originais do array:
php global.php
022.011.333-12 - Nome: Alberto / Saldo R$: 500
356.722.833212 - Nome: Julia / Saldo R$: 200
963.720.639-08 - Nome: Rodrigo / Saldo R$: 8000
------------------------------------------------------------------------
Iterado para Alberto - Sacado / Saldo: 0
Iterado para Julia - saldo insuficiente. / Saldo: 200
Iterado para Rodrigo - Sacado / Saldo: 7500
------------------------------------------------------------------------
022.011.333-12 - Nome: Alberto / Saldo R$: 500
356.722.833212 - Nome: Julia / Saldo R$: 200
963.720.639-08 - Nome: Rodrigo / Saldo R$: 8000Por que isto está acontecendo? No terceiro laço os valores impressos deveriam ser os já manipulados e não os originais como está ocorrendo, ou esta é uma avaliação errada de minha parte?
Eu sei que poderia resolver esta situação declarando o segundo laço desta forma (após alterar o retorno da função):
foreach ($contas as $cpf=>$conta){
    echo "Iterado para ".$conta['nome'];
    $contas[$cpf] = saque($conta,500);
    echo " / Saldo: ".$contas[$cpf]['saldo'].PHP_EOL;
};Porém gostaria de entender as razões para a interpretação do código se comportar desta forma.
 
            