En PHP, les méthodes pour implémenter la copie approfondie de tableau incluent : la copie élément par élément, à l'aide de array_map(), les fonctions intégrées PHP clone() et array_slice() et la bibliothèque tierce DeepCopy. La copie élément par élément implique l'utilisation d'une boucle for, array_map() utilise une fonction de rappel, clone() crée une référence et array_slice() force une copie complète. La bibliothèque tierce DeepCopy est dédiée à la copie approfondie et peut être utilisée dans des scénarios complexes. Dans des applications pratiques, il peut être utilisé pour cloner les articles du panier afin d'éviter d'affecter le panier d'origine.
En PHP, le tableau est un type de variable universelle largement utilisé. Lorsque vous devez manipuler un tableau et ses éléments, il est nécessaire d'en créer des copies pour éviter des modifications involontaires d'effets secondaires sur le tableau d'origine. PHP propose plusieurs méthodes pour implémenter la copie complète, chacune avec ses propres avantages et inconvénients.
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
pour parcourir le tableau et créer une copie élément par élément . L'exemple de code est le suivant : <?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()
fournit une manière plus concise d'appliquer une fonction de rappel personnalisée à chaque élément du tableau . Pour faire une copie complète, vous pouvez définir la fonction de rappel comme fonction d'identité : <?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()
et array_slice()
🎜🎜 Pour les tableaux simples, le mot-clé clone
crée un nouveau tableau qui contient des références aux éléments du tableau d'origine. Cependant, si le tableau d'origine contient un tableau imbriqué, les éléments imbriqués sont uniquement référencés et non réellement copiés. 🎜🎜La fonction array_slice
peut être utilisée avec clone
pour forcer une copie complète des tableaux imbriqués : 🎜rrreee🎜Utilisez une bibliothèque externe : DeepCopy
🎜 🎜Si vous avez souvent besoin d'effectuer une copie approfondie, vous pouvez utiliser une bibliothèque tierce telle que DeepCopy, spécialisée dans la copie approfondie d'objets et de tableaux. 🎜rrreee🎜Cas pratique : cloner les articles dans le panier🎜🎜L'exemple suivant montre comment utiliser la copie profonde pour cloner les articles dans le panier afin que les articles puissent être modifiés sans affecter le panier d'origine :🎜rrreeeCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!