PHP 배열 딥 카피 이해하기: 다양한 방법 뒤에 숨은 비밀

WBOY
풀어 주다: 2024-05-02 22:09:02
원래의
349명이 탐색했습니다.

PHP에서 배열 전체 복사를 구현하는 방법에는 array_map()을 사용하는 요소별 복사, PHP 내장 함수 clone() 및 array_slice(), 타사 라이브러리 DeepCopy가 포함됩니다. 요소별 복사에는 for 루프 사용이 포함되며, array_map()은 콜백 함수를 사용하고, clone()은 참조를 생성하고, array_slice()는 전체 복사를 강제합니다. 타사 라이브러리 DeepCopy는 심층 복사 전용이며 복잡한 시나리오에서 사용할 수 있습니다. 실제 응용 프로그램에서는 원래 장바구니에 영향을 주지 않도록 장바구니에 있는 항목을 복제하는 데 사용할 수 있습니다.

PHP 배열 딥 카피 이해하기: 다양한 방법 뒤에 숨은 비밀

PHP 배열 딥 카피 공개: 다양한 메서드 뒤에 숨은 비밀

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);
?>
로그인 후 복사

使用 PHP 内置函数: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);
?>
로그인 후 복사
PHP 내장 함수 사용: clone()array_slice()🎜🎜 단순 배열의 경우 clone 키워드는 원래 배열 요소에 대한 참조를 포함하는 새 배열을 만듭니다. 그러나 원본 배열에 중첩된 배열이 포함된 경우 중첩된 요소는 참조만 되고 실제로 복사되지는 않습니다. 🎜🎜array_slice 함수를 clone과 함께 사용하여 중첩 배열의 전체 복사본을 강제로 만들 수 있습니다. 🎜rrreee🎜외부 라이브러리 사용: DeepCopy🎜 🎜딥 카피가 자주 필요한 경우 객체 및 배열 딥 카피에 특화된 DeepCopy와 같은 타사 라이브러리를 사용할 수 있습니다. 🎜rrreee🎜실용 사례: 장바구니에 있는 항목 복제🎜🎜다음 예에서는 원래 장바구니에 영향을 주지 않고 항목을 수정할 수 있도록 전체 복사를 사용하여 장바구니에 있는 항목을 복제하는 방법을 보여줍니다.🎜rrreee

위 내용은 PHP 배열 딥 카피 이해하기: 다양한 방법 뒤에 숨은 비밀의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿