Apabila menulis kod PHP, kita selalunya perlu menggunakan tatasusunan untuk menyimpan beberapa data. Walau bagaimanapun, apabila menggunakan tatasusunan, kadangkala pengambilan tatasusunan tidak lengkap, iaitu, hanya sebahagian daripada data diambil. Keadaan ini sering membawa kepada ralat atur cara dan menjejaskan operasi biasa atur cara. Artikel ini akan memperkenalkan sebab untuk mendapatkan semula tatasusunan yang tidak lengkap dan cara menyelesaikan masalah ini.
1. Analisis sebab
Dalam PHP, anda boleh menggunakan gelung foreach untuk melintasi tatasusunan. Apabila menggunakan gelung foreach, PHP sebenarnya secara dalaman mencipta penunjuk kepada elemen pertama tatasusunan. Jika nilai penuding diubah suai semasa gelung, penuding akan menghala ke kedudukan yang diubah semasa gelung seterusnya, bukannya menunjuk ke elemen seterusnya. Ini akan menyebabkan hanya sebahagian daripada data diambil semula.
Kod sampel adalah seperti berikut:
$arr = array(1, 2, 3, 4, 5); foreach ($arr as $value) { echo $value . '<br />'; if ($value == 2) { reset($arr); } }
Dalam kod di atas, jika elemen dengan nilai 2 digelung, penunjuk tatasusunan akan ditetapkan semula kepada elemen pertama, yang akan menyebabkan gelung seterusnya ke Mula semula dari elemen pertama. Oleh itu, hanya elemen dengan nilai 1 dan 2 dicetak.
Dalam PHP, anda boleh menggunakan fungsi unset untuk memadamkan elemen dalam tatasusunan. Walau bagaimanapun, jika anda menggunakan fungsi tidak ditetapkan untuk memadam elemen semasa melintasi tatasusunan, hanya sebahagian daripada data akan dikeluarkan.
Kod sampel adalah seperti berikut:
$arr = array(1, 2, 3, 4, 5); foreach ($arr as $value) { if ($value == 2) { unset($arr[2]); } echo $value . '<br />'; }
Dalam kod di atas, jika elemen dengan nilai 2 digelung, fungsi tidak ditetapkan akan digunakan untuk memadam elemen dengan indeks 2 dalam tatasusunan , iaitu unsur dengan nilai 3 . Ini menyebabkan lelaran seterusnya gelung bermula dari elemen dengan indeks 3, jadi hanya elemen dengan nilai 1, 2, 4, dan 5 dicetak.
Dalam PHP, anda boleh menghantar pembolehubah tatasusunan menggunakan rujukan. Apabila menghantar pembolehubah tatasusunan melalui rujukan, jika elemen tatasusunan diubah suai dalam badan fungsi, hanya sebahagian daripada data akan diambil.
Kod sampel adalah seperti berikut:
function test(&$arr) { foreach ($arr as $value) { if ($value == 2) { $arr[3] = 6; } echo $value . '<br />'; } } $arr = array(1, 2, 3, 4, 5); test($arr);
Dalam kod di atas, ujian fungsi menerima rujukan kepada pembolehubah tatasusunan. Dalam badan fungsi, jika anda menggelungkan ke elemen dengan nilai 2, nilai elemen dengan indeks tatasusunan 3 akan diubah suai kepada 6. Ini menyebabkan lelaran gelung seterusnya bermula pada indeks elemen 4, jadi hanya elemen dengan nilai 1, 2, 3, dan 6 dicetak.
2. Penyelesaian
Dalam PHP, anda boleh menggunakan gelung for dan bukannya foreach gelung. Apabila menggunakan gelung for, anda boleh menetapkan kedudukan penunjuk tatasusunan secara manual untuk mengelakkan masalah penunjuk tatasusunan ditetapkan semula.
Kod sampel adalah seperti berikut:
$arr = array(1, 2, 3, 4, 5); for ($i = 0; $i < count($arr); $i++) { echo $arr[$i] . '<br />'; if ($arr[$i] == 2) { $i = 0; } }
Dalam kod di atas, gelung for digunakan untuk melintasi tatasusunan dan menetapkan kedudukan penuding tatasusunan secara manual. Jika anda menggelungkan ke elemen dengan nilai 2, penunjuk tatasusunan akan ditetapkan semula kepada elemen pertama, yang mengelakkan masalah penunjuk tatasusunan ditetapkan semula.
Apabila melintasi tatasusunan, cuba elakkan mengubahsuai elemen tatasusunan. Jika elemen tatasusunan mesti diubah suai, pembolehubah perantaraan boleh digunakan untuk menyimpan elemen yang diubah suai untuk mengelakkan masalah gangguan gelung yang disebabkan oleh mengubah suai terus elemen tatasusunan.
Kod sampel adalah seperti berikut:
$arr = array(1, 2, 3, 4, 5); $temp = array(); foreach ($arr as $value) { if ($value == 2) { $temp[] = 6; } else { $temp[] = $value; } } $arr = $temp; foreach ($arr as $value) { echo $value . '<br />'; }
Dalam kod di atas, mula-mula gunakan gelung foreach untuk melintasi tatasusunan dan simpan elemen yang perlu diubah suai menjadi pembolehubah perantaraan. Kemudian, simpan elemen yang diubah suai ke dalam tatasusunan baharu. Akhir sekali, gunakan gelung foreach untuk menggelungkan tatasusunan baharu dan mencetak semua elemen.
Dalam PHP, anda boleh menghantar pembolehubah tatasusunan menggunakan rujukan. Walau bagaimanapun, jika anda tidak mahu mengubah suai elemen tatasusunan dalam badan fungsi apabila menghantar pembolehubah tatasusunan melalui rujukan, anda boleh menggunakan fungsi salin untuk membuat salinan tatasusunan, dan kemudian beroperasi pada tatasusunan yang disalin.
Kod sampel adalah seperti berikut:
function test($arr) { $copy_arr = $arr; foreach ($copy_arr as $value) { if ($value == 2) { $copy_arr[3] = 6; } echo $value . '<br />'; } } $arr = array(1, 2, 3, 4, 5); test($arr);
Dalam kod di atas, ujian fungsi menerima pembolehubah tatasusunan biasa. Dalam badan fungsi, gunakan fungsi salin untuk membuat salinan pembolehubah tatasusunan dan gunakan pembolehubah tatasusunan yang disalin sebagai sasaran gelung. Ini boleh mengelakkan masalah hanya sebahagian daripada data yang dikeluarkan kerana lulus pembolehubah tatasusunan dengan rujukan.
Atas ialah kandungan terperinci PHP mendapatkan semula tatasusunan yang tidak lengkap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!