在 PHP 中,實作陣列深度複製的方法有:逐元素複製、使用 array_map()、PHP 內建函數 clone() 和 array_slice()、第三方函式庫 DeepCopy。逐元素複製涉及使用 for 循環,array_map() 使用回呼函數,clone() 可建立引用,而 array_slice() 強制深度複製。第三方函式庫 DeepCopy 專用於深度複製,可用於複雜場景。實際應用中,它可用於複製購物車中的商品,避免對原始購物車產生影響。
在 PHP 中,陣列是廣泛使用的萬能變數類型。在需要操作陣列及其元素時,有必要建立它們的副本,以避免對原始陣列進行意外的副作用修改。 PHP 提供了多種方法來實現深度複製,每個方法都有其優點和缺點。
for
迴圈最基本的方法是使用 for
循環遍歷陣列並逐個元素地建立副本。程式碼範例如下:
<?php $originalArray = [1, 2, ['a', 'b']]; $newArray = []; for ($i = 0; $i < count($originalArray); $i++) { if (is_array($originalArray[$i])) { $newArray[$i] = []; for ($j = 0; $j < count($originalArray[$i]); $j++) { $newArray[$i][$j] = $originalArray[$i][$j]; } } else { $newArray[$i] = $originalArray[$i]; } } print_r($originalArray); print_r($newArray); ?>
array_map()
array_map()
函數提供了更簡潔的方法來應用自訂回呼函數到數組中的每個元素。若要進行深度複製,您可以將回呼函數設為恆等函數:
<?php $originalArray = [1, 2, ['a', 'b']]; $newArray = array_map(function($item) { return is_array($item) ? array_map(__FUNCTION__, $item) : $item; }, $originalArray); print_r($originalArray); print_r($newArray); ?>
clone()
和array_slice()
對於簡單數組,clone
關鍵字可以建立一個新的數組,該數組包含對原始數組元素的參考。但是,如果原始數組包含巢狀數組,則嵌套元素只會被引用,而不會實際複製。
array_slice
函數可以與clone
一起使用,以強制對巢狀陣列進行深度複製:
<?php $originalArray = [1, 2, ['a', 'b']]; $newArray = clone $originalArray; $newArray[2] = array_slice($newArray[2], 0); print_r($originalArray); print_r($newArray); ?>
DeepCopy
如果您經常需要進行深度複製,您可以使用第三方函式庫,例如DeepCopy,它專門用於深度複製物件和陣列。
<?php useDeepCopy\DeepCopy; $copier = new DeepCopy(); $originalArray = [1, 2, ['a', 'b']]; $newArray = $copier->copy($originalArray); print_r($originalArray); print_r($newArray); ?>
以下範例示範如何使用深度複製,以複製購物車中的商品,以便對商品進行修改而不會影響原始購物車:
<?php class Product { public $name; public $price; public function __construct($name, $price) { $this->name = $name; $this->price = $price; } } class Cart { private array $products; public function addProduct(Product $product) { $this->products[] = $product; } public function getProducts() { return $this->products; } public function cloneProducts() { $copier = new DeepCopy(); return $copier->copy($this->products); } } $cart = new Cart(); $cart->addProduct(new Product('Apple', 1.5)); $cart->addProduct(new Product('Banana', 2.0)); $clonedProducts = $cart->cloneProducts(); $clonedProducts[0]->price = 1.8; print_r($cart->getProducts()); print_r($clonedProducts); ?>
以上是揭秘PHP數組深度複製:不同方法背後的秘密的詳細內容。更多資訊請關注PHP中文網其他相關文章!