Heim  >  Artikel  >  Backend-Entwicklung  >  PHP Array Deep Copy entmystifizieren: Die Geheimnisse hinter verschiedenen Methoden

PHP Array Deep Copy entmystifizieren: Die Geheimnisse hinter verschiedenen Methoden

WBOY
WBOYOriginal
2024-05-02 22:09:02310Durchsuche

In PHP umfassen die Methoden zum Implementieren einer Array-Deep-Kopie: elementweises Kopieren mit array_map(), den in PHP integrierten Funktionen clone() und array_slice() sowie der Drittanbieter-Bibliothek DeepCopy. Beim Element-für-Element-Kopieren wird eine for-Schleife verwendet, array_map() verwendet eine Callback-Funktion, clone() erstellt eine Referenz und array_slice() erzwingt eine tiefe Kopie. Die Drittanbieterbibliothek DeepCopy ist auf Deep Copying spezialisiert und kann in komplexen Szenarien eingesetzt werden. In praktischen Anwendungen können damit die Artikel im Warenkorb geklont werden, um eine Beeinträchtigung des ursprünglichen Warenkorbs zu vermeiden.

PHP Array Deep Copy entmystifizieren: Die Geheimnisse hinter verschiedenen Methoden

Enthüllung von PHP Array Deep Copy: Die Geheimnisse hinter verschiedenen Methoden

In PHP ist Array ein weit verbreiteter universeller Variablentyp. Wenn Sie ein Array und seine Elemente manipulieren müssen, müssen Sie Kopien davon erstellen, um unbeabsichtigte Nebenwirkungen von Änderungen am ursprünglichen Array zu vermeiden. PHP bietet mehrere Methoden zur Implementierung von Deep Copy, jede mit ihren eigenen Vor- und Nachteilen.

Elementweises Kopieren: Verwenden Sie die for-Schleife. 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

Die einfachste Möglichkeit besteht darin, for zu verwenden, um das Array zu durchlaufen und eine Element-für-Element-Kopie zu erstellen . Das Codebeispiel lautet wie folgt:

<?php

useDeepCopy\DeepCopy;

$copier = new DeepCopy();

$originalArray = [1, 2, ['a', 'b']];

$newArray = $copier->copy($originalArray);

print_r($originalArray);
print_r($newArray);
?>

Die Verwendung der Funktion array_map()

array_map() bietet eine präzisere Möglichkeit, eine benutzerdefinierte Rückruffunktion auf jedes Element im anzuwenden Array. Um eine tiefe Kopie zu erstellen, können Sie die Callback-Funktion als Identitätsfunktion festlegen:

<?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);
?>

Verwenden Sie die in PHP integrierten Funktionen: clone() und array_slice()🎜🎜 Bei einfachen Arrays erstellt das Schlüsselwort clone ein neues Array, das Verweise auf die ursprünglichen Array-Elemente enthält. Wenn das ursprüngliche Array jedoch ein verschachteltes Array enthält, werden die verschachtelten Elemente nur referenziert und nicht tatsächlich kopiert. 🎜🎜Die Funktion array_slice kann mit clone verwendet werden, um eine tiefe Kopie verschachtelter Arrays zu erzwingen: 🎜rrreee🎜Verwenden Sie eine externe Bibliothek: DeepCopy🎜 🎜Wenn Sie häufig Deep Copy benötigen, können Sie eine Bibliothek eines Drittanbieters wie DeepCopy verwenden, die auf das Deep Copy von Objekten und Arrays spezialisiert ist. 🎜rrreee🎜Praktischer Fall: Klonen Sie die Artikel im Warenkorb🎜🎜Das folgende Beispiel zeigt, wie Sie mit Deep Copy die Artikel im Warenkorb klonen, sodass die Artikel geändert werden können, ohne dass sich dies auf den ursprünglichen Warenkorb auswirkt:🎜rrreee

Das obige ist der detaillierte Inhalt vonPHP Array Deep Copy entmystifizieren: Die Geheimnisse hinter verschiedenen Methoden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn