Maison >développement back-end >tutoriel php >Stratégie de copie de tableau PHP : copie profonde et copie superficielle, analyse et comparaison des performances

Stratégie de copie de tableau PHP : copie profonde et copie superficielle, analyse et comparaison des performances

WBOY
WBOYoriginal
2024-05-02 14:57:01820parcourir

En PHP, il existe deux stratégies pour la copie de tableaux : la copie profonde et la copie superficielle. Une copie complète crée une copie indépendante du tableau source et les modifications apportées à un tableau n'affectent pas l'autre tableau. La copie superficielle copie uniquement les références des tableaux, les modifications apportées à l'un des tableaux sont reflétées dans l'autre tableau. La copie profonde nécessite de parcourir le tableau et de créer de nouvelles entités, elle nécessite donc plus de ressources que la copie superficielle, mais la copie superficielle ne peut copier que des références, elle est donc plus rapide. La copie profonde est utilisée pour créer une collection indépendante d'enregistrements de base de données, tandis que la copie superficielle est utilisée pour transmettre un tableau à une fonction.

Stratégie de copie de tableau PHP : copie profonde et copie superficielle, analyse et comparaison des performances

Stratégie de copie de tableau PHP : copie profonde ou copie superficielle

En PHP, les variables de tableau sont transmises par référence. Cela signifie que toute modification apportée au tableau d'origine sera reflétée dans toutes les variables faisant référence au tableau. Cependant, lorsque nous devons créer des copies de tableaux afin d'y apporter des modifications indépendantes, il est nécessaire de comprendre la différence entre la copie profonde et la copie superficielle.

Deep Copy

Deep Copy crée une copie complètement indépendante du tableau source dans le tableau de destination. Les modifications apportées au tableau de destination n'affectent pas le tableau d'origine et vice versa.

$original_array = ['foo' => 'bar', 'baz' => ['a' => 1, 'b' => 2]];

// 深度复制
$deep_copy = clone $original_array; // 或使用深拷贝函数如 array_map(function($value) { return clone $value; }, $original_array)

$deep_copy['foo'] = 'new_bar';
$deep_copy['baz']['a'] = 3;

var_dump($original_array); // 输出: ['foo' => 'bar', 'baz' => ['a' => 1, 'b' => 2]]
var_dump($deep_copy); // 输出: ['foo' => 'new_bar', 'baz' => ['a' => 3, 'b' => 2]]

Copie superficielle

La copie superficielle copie uniquement la référence du tableau source. Les modifications apportées au tableau de destination sont également reflétées dans le tableau d'origine.

$original_array = ['foo' => 'bar', 'baz' => ['a' => 1, 'b' => 2]];

// 浅复制
$shallow_copy = $original_array;

$shallow_copy['foo'] = 'new_bar';
$shallow_copy['baz']['a'] = 3;

var_dump($original_array); // 输出: ['foo' => 'new_bar', 'baz' => ['a' => 3, 'b' => 2]]
var_dump($shallow_copy); // 输出: ['foo' => 'new_bar', 'baz' => ['a' => 3, 'b' => 2]]

Différence de performances

La copie approfondie nécessite plus de ressources que la copie superficielle, car l'intégralité du tableau source doit être parcourue et de nouvelles entités créées pour le tableau de destination. Les copies superficielles ne copient que les références et sont donc généralement beaucoup plus rapides que les copies profondes.

Cas pratique

Utilisez la copie profonde pour créer une collection indépendante d'enregistrements de base de données

// 从数据库获取记录
$records = $db->fetchRecords();

// 深度复制记录集合以进行独立更新
$updated_records = clone $records;

Utilisez la copie superficielle pour transmettre un tableau à une fonction

function updateRecord($record) {
  $record['updated'] = true;
}

$original_record = ['id' => 1, 'name' => 'John'];

// 浅复制原始记录并更新副本
$shallow_copy = $original_record;
updateRecord($shallow_copy);

// 更新会反映在原始记录中
var_dump($original_record); // 输出: ['id' => 1, 'name' => 'John', 'updated' => true]

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