Maison  >  Article  >  développement back-end  >  Démystifier PHP Array Deep Copy : les secrets derrière les différentes méthodes

Démystifier PHP Array Deep Copy : les secrets derrière les différentes méthodes

WBOY
WBOYoriginal
2024-05-02 22:09:02313parcourir

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.

Démystifier PHP Array Deep Copy : les secrets derrière les différentes méthodes

Révéler la copie approfondie des tableaux PHP : les secrets derrière les différentes méthodes

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.

Copie élément par élément : utilisez la boucle 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

La méthode la plus simple consiste à utiliser 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);
?>

L'utilisation de la fonction 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);
?>

Utilisez les fonctions intégrées PHP : 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 :🎜rrreee

Ce 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn