Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Strategi penyalinan tatasusunan PHP: salinan dalam dan salinan cetek, penghuraian dan perbandingan prestasi

Strategi penyalinan tatasusunan PHP: salinan dalam dan salinan cetek, penghuraian dan perbandingan prestasi

WBOY
WBOYasal
2024-05-02 14:57:01656semak imbas

Dalam PHP, terdapat dua strategi untuk penyalinan tatasusunan: penyalinan dalam dan penyalinan cetek. Salinan dalam mencipta salinan bebas tatasusunan sumber, dan perubahan kepada satu tatasusunan tidak menjejaskan tatasusunan yang lain. Salinan cetek hanya menyalin rujukan tatasusunan, perubahan kepada satu tatasusunan dicerminkan dalam tatasusunan yang lain. Salinan dalam memerlukan melintasi tatasusunan dan mencipta entiti baharu, jadi ia lebih intensif sumber berbanding salinan cetek, tetapi salinan cetek hanya boleh menyalin rujukan, jadi ia lebih pantas. Salinan dalam digunakan untuk mencipta koleksi bebas rekod pangkalan data, manakala salinan cetek digunakan untuk menghantar tatasusunan kepada fungsi.

Strategi penyalinan tatasusunan PHP: salinan dalam dan salinan cetek, penghuraian dan perbandingan prestasi

Strategi Salin Tatasusunan PHP: Salinan Dalam vs Salinan Cetek

Dalam PHP, pembolehubah tatasusunan diluluskan melalui rujukan. Ini bermakna bahawa sebarang perubahan yang dibuat pada tatasusunan asal akan ditunjukkan dalam semua pembolehubah yang merujuk tatasusunan. Walau bagaimanapun, apabila kita perlu membuat salinan tatasusunan untuk membuat perubahan bebas kepada mereka, adalah perlu untuk memahami perbezaan antara salinan dalam dan salinan cetek.

Deep Copy

Deep copy mencipta salinan bebas sepenuhnya tatasusunan sumber dalam tatasusunan destinasi. Perubahan kepada tatasusunan destinasi tidak menjejaskan tatasusunan asal dan begitu juga sebaliknya.

$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]]

Salinan cetek

Salinan cetek hanya menyalin rujukan tatasusunan sumber. Perubahan pada tatasusunan destinasi juga ditunjukkan dalam tatasusunan asal.

$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]]

Perbezaan prestasi

Salinan dalam adalah lebih intensif sumber berbanding salinan cetek kerana keseluruhan tatasusunan sumber mesti dilalui dan entiti baharu dicipta untuk tatasusunan destinasi. Salinan cetek hanya menyalin rujukan dan oleh itu biasanya lebih cepat daripada salinan dalam.

Kes praktikal

Gunakan salinan dalam untuk mencipta koleksi bebas rekod pangkalan data

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

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

Gunakan salinan cetek untuk menghantar tatasusunan kepada fungsi

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]

Atas ialah kandungan terperinci Strategi penyalinan tatasusunan PHP: salinan dalam dan salinan cetek, penghuraian dan perbandingan prestasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn