2014-02-25 19 views
1
$obj = new StdClass(); 
$obj->prop1 = 1; 
$obj->prop2 = 2; 
$a1 = array(
    0 => $obj, 
    1 => $obj, 
); 
$a2 = $a1; 
$a1[0]->prop1 = 100; 
var_dump($a2); 

當前的結果:拒絕代理傳遞變量通過鏈路

$a2 = array(
    0 => stdClass::__set_state(array(
     'prop1' => 100, 
     'prop2' => 2 
    )), 
    1 => stdClass::__set_state(array(
     'prop1' => 100, 
     'prop2' => 2 
    )) 
); 

要求的結果:

$a2 = array(
    0 => stdClass::__set_state(array(
     'prop1' => 1, 
     'prop2' => 2 
    )), 
    1 => stdClass::__set_state(array(
     'prop1' => 1, 
     'prop2' => 2 
    )) 
); 

PHP 5.5.3-1ubuntu2.1

回答

1

試試這個:

function deepClone(array $input) { 
    $output = array(); 
    foreach($input as $key => $obj) { 
     $output[$key] = clone $obj; 
    } 

    return $output; 
} 

$obj = new StdClass(); 
$obj->prop1 = 1; 
$obj->prop2 = 2; 
$a1 = array(
    0 => $obj, 
    1 => $obj, 
); 
$a2 = deepClone($a1); 
$a1[0]->prop1 = 100; 
var_dump($a2); 

但我覺得你應該想出一個不同的方法來解決你的問題,因爲我傾向於儘可能避免clone