在 php 中,數組復制有兩種策略:深度復制和淺復制。深度復制創建源數組的獨立副本,對其中一個數組的更改不會影響另一個數組。淺復制僅復制數組的引用,對其中一個數組的更改會反映在另一個數組中。深度復制需要遍歷數組并創建新實體,因此比淺復制更耗資源,但淺復制只能復制引用,因此速度更快。深度復制用于創建獨立的數據庫記錄集合,而淺復制則用于將數組傳遞給函數。
PHP 數組復制策略:深度復制 vs 淺復制
在 PHP 中,數組變量通過引用傳遞。這意味著對原始數組所做的任何更改都將反映在所有引用該數組的變量中。但是,當我們需要創建數組的副本以便對它們進行獨立更改時,就有必要理解深度復制和淺復制之間的區別。
深度復制
深度復制創建目標數組中源數組的完全獨立副本。對目標數組的更改不會影響原始數組,反之亦然。
$original_array = ['foo' => 'bar', 'baz' => ['a' => 1, 'b' => 2]]; // 深度復制 $deep_copy = clone $original_array; // 或使用深拷貝函數如 array_map(function($value) { return clone $value; }, $original_array) $deep_copy['foo'] = 'new_bar'; $deep_copy['baz']['a'] = 3; var_dump($original_array); // 輸出: ['foo' => 'bar', 'baz' => ['a' => 1, 'b' => 2]] var_dump($deep_copy); // 輸出: ['foo' => 'new_bar', 'baz' => ['a' => 3, 'b' => 2]]
登錄后復制
淺復制
淺復制僅復制源數組的引用。對目標數組的更改也會反映在原始數組中。
$original_array = ['foo' => 'bar', 'baz' => ['a' => 1, 'b' => 2]]; // 淺復制 $shallow_copy = $original_array; $shallow_copy['foo'] = 'new_bar'; $shallow_copy['baz']['a'] = 3; var_dump($original_array); // 輸出: ['foo' => 'new_bar', 'baz' => ['a' => 3, 'b' => 2]] var_dump($shallow_copy); // 輸出: ['foo' => 'new_bar', 'baz' => ['a' => 3, 'b' => 2]]
登錄后復制
性能差異
深度復制比淺復制更耗費資源,因為必須遍歷整個源數組并為目標數組創建新實體。淺復制只需復制引用,因此通常比深度復制快得多。
實戰案例
使用深度復制創建獨立的數據庫記錄集合
// 從數據庫獲取記錄 $records = $db->fetchRecords(); // 深度復制記錄集合以進行獨立更新 $updated_records = clone $records;
登錄后復制
使用淺復制將數組傳遞給函數
function updateRecord($record) { $record['updated'] = true; } $original_record = ['id' => 1, 'name' => 'John']; // 淺復制原始記錄并更新副本 $shallow_copy = $original_record; updateRecord($shallow_copy); // 更新會反映在原始記錄中 var_dump($original_record); // 輸出: ['id' => 1, 'name' => 'John', 'updated' => true]
登錄后復制