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.
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 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 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]]
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.
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!