PHP에서 배열 전체 복사를 구현하는 방법에는 array_map()을 사용하는 요소별 복사, PHP 내장 함수 clone() 및 array_slice(), 타사 라이브러리 DeepCopy가 포함됩니다. 요소별 복사에는 for 루프 사용이 포함되며, array_map()은 콜백 함수를 사용하고, clone()은 참조를 생성하고, array_slice()는 전체 복사를 강제합니다. 타사 라이브러리 DeepCopy는 심층 복사 전용이며 복잡한 시나리오에서 사용할 수 있습니다. 실제 응용 프로그램에서는 원래 장바구니에 영향을 주지 않도록 장바구니에 있는 항목을 복제하는 데 사용할 수 있습니다.
PHP에서 배열은 널리 사용되는 범용 변수 유형입니다. 배열과 해당 요소를 조작해야 하는 경우 원래 배열에 대한 의도하지 않은 부작용 수정을 방지하기 위해 복사본을 만들어야 합니다. PHP는 딥 카피를 구현하는 여러 가지 방법을 제공하며, 각 방법에는 고유한 장점과 단점이 있습니다.
for
루프 사용 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
for
를 사용하여 배열을 반복하고 요소별로 복사본을 만드는 것입니다. . 코드 예시는 다음과 같습니다. <?php useDeepCopy\DeepCopy; $copier = new DeepCopy(); $originalArray = [1, 2, ['a', 'b']]; $newArray = $copier->copy($originalArray); print_r($originalArray); print_r($newArray); ?>
array_map()
array_map()
함수를 사용하면 사용자 정의 콜백 함수를 배열 . 전체 복사를 수행하려면 콜백 함수를 ID 함수로 설정할 수 있습니다. <?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); ?>
clone()
및 array_slice()
🎜🎜 단순 배열의 경우 clone
키워드는 원래 배열 요소에 대한 참조를 포함하는 새 배열을 만듭니다. 그러나 원본 배열에 중첩된 배열이 포함된 경우 중첩된 요소는 참조만 되고 실제로 복사되지는 않습니다. 🎜🎜array_slice
함수를 clone
과 함께 사용하여 중첩 배열의 전체 복사본을 강제로 만들 수 있습니다. 🎜rrreee🎜외부 라이브러리 사용: DeepCopy
🎜 🎜딥 카피가 자주 필요한 경우 객체 및 배열 딥 카피에 특화된 DeepCopy와 같은 타사 라이브러리를 사용할 수 있습니다. 🎜rrreee🎜실용 사례: 장바구니에 있는 항목 복제🎜🎜다음 예에서는 원래 장바구니에 영향을 주지 않고 항목을 수정할 수 있도록 전체 복사를 사용하여 장바구니에 있는 항목을 복제하는 방법을 보여줍니다.🎜rrreee위 내용은 PHP 배열 딥 카피 이해하기: 다양한 방법 뒤에 숨은 비밀의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!