PHP: ссылки разделяются между рекурсивными вызовами

У меня есть три функции, foo, bar и baz, которые, с моей точки зрения, должны давать идентичные результаты. Однако я столкнулся с проблемой, что ссылки разделяются между вызовами рекурсивных функций.

$array = array(
    'subs' => array(
        'a' => 1,
        'b' => 2,
    ),
);

function foo(&$array, $value, $callAgain = true) {
    $subs =& $array['subs'];
    foreach ($subs as &$sub)
        $sub = $value;
    if ($callAgain) {
        $copy = $array;
        foo($copy, $value + 1, false);
    }
}

function bar(&$array, $value, $callAgain = true) {
    foreach ($array['subs'] as &$sub)
        $sub = $value;
    if ($callAgain) {
        $copy = $array;
        bar($copy, $value + 1, false);
    }
}

function baz(&$array, $value, $callAgain = true) {
    foreach ($array['subs'] as $key => $sub)
        $array['subs'][$key] = $value;
    if ($callAgain) {
        $copy = $array;
        baz($copy, $value + 1, false);
    }
}

foo($array, 3);
var_dump($array);
bar($array, 3);
var_dump($array);
baz($array, 3);
var_dump($array);

Этот код дает следующие результаты:

array
  'subs' => 
    array
      'a' => int 4
      'b' => int 4
array
  'subs' => 
    array
      'a' => int 3
      'b' => int 4
array
  'subs' => 
    array
      'a' => int 3
      'b' => int 3

Однако я ожидаю, что все они вернут 3, 3, потому что копии массива передаются рекурсивным вызовам.

Как исправить первые две функции, чтобы они возвращали 3, 3? Я бы предпочел не использовать синтаксис функции baz, потому что он очень многословен.

5
задан Athari 26 November 2011 в 23:13
поделиться