Dalam PHP, tatasusunan ialah struktur data yang sangat biasa digunakan yang boleh menyimpan berbilang elemen dan melaksanakan pelbagai operasi. Dalam banyak kes, kita perlu menggunakan gelung untuk melintasi tatasusunan dan beroperasi pada elemennya. PHP menyediakan pelbagai pernyataan gelung, antaranya foreach adalah pernyataan yang biasa digunakan.
Walau bagaimanapun, kadangkala apabila kita mengendalikan elemen tatasusunan dalam gelung foreach, panjang tatasusunan mungkin berubah, sekali gus menjejaskan hasil gelung. Artikel ini akan memperkenalkan masalah menukar panjang tatasusunan dalam gelung foreach dan menyediakan beberapa penyelesaian.
1. Pengetahuan asas gelung foreach
Dalam PHP, gelung foreach ialah pernyataan yang merentasi tatasusunan adalah seperti berikut:
foreach ($array as $value) { //对 $value 进行操作 }
di mana $ tatasusunan mewakili keperluan Tatasusunan yang dilalui, $value mewakili elemen tatasusunan yang sedang dilalui. Dalam badan gelung, pelbagai operasi boleh dilakukan pada $value, seperti output, pengubahsuaian, dll.
2. Masalah menukar panjang tatasusunan dalam gelung foreach
Apabila menggunakan gelung foreach untuk melintasi tatasusunan, jika anda menambah atau memadam elemen dalam tatasusunan, panjangnya tatasusunan mungkin berubah , sekali gus menjejaskan keputusan kitaran. Mari kita lihat contoh khusus:
$array = [1, 2, 3, 4, 5]; foreach ($array as $value) { if ($value == 3) { array_splice($array, $value-1, 1); } echo $value . " "; }
Apabila merentasi tatasusunan $array, kod di atas menggunakan fungsi array_splice untuk memadamkan elemen dengan nilai 3 apabila ia dilalui. Walau bagaimanapun, kerana panjang $array berubah semasa gelung, output tidak memenuhi jangkaan.
Secara khusus, outputnya ialah:
1 2 4 5
dan bukannya apa yang kami jangkakan:
1 2 4
Ini kerana selepas memadamkan elemen dengan nilai 3 , unsur-unsur dalam tatasusunan akan bergerak ke hadapan satu kedudukan, dan dalam gelung seterusnya, elemen yang sedang dilalui ialah elemen dengan indeks tatasusunan asal 3 (iaitu, nilainya ialah 4). Ini akan menyebabkan satu elemen dalam tatasusunan asal dilangkau semasa proses traversal.
3. Penyelesaian
Pelbagai cara boleh digunakan untuk menyelesaikan masalah di atas. Dua kaedah yang biasa digunakan diperkenalkan di bawah.
(1) Salin tatasusunan
Satu penyelesaian ialah menyalin tatasusunan asal sebelum mengubah suai tatasusunan, kemudian ubah suai tatasusunan baharu, dan akhirnya salin tatasusunan yang diubahsuai Tatasusunan itu disalin semula ke tatasusunan asal. Ini boleh mengelakkan masalah panjang tatasusunan asal berubah.
$array = [1, 2, 3, 4, 5]; $new_array = $array; foreach ($new_array as $key => $value) { if ($value == 3) { unset($new_array[$key]); } } $array = $new_array; foreach ($array as $value) { echo $value . " "; }
Dalam kod di atas, tatasusunan $array pertama kali disalin ke pembolehubah baharu $new_array, dan operasi pemadaman dilakukan pada tatasusunan baharu. Kemudian salin $new_array yang diubah suai kembali ke array asal $array. Dengan cara ini, anda mendapat hasil yang betul apabila mengeluarkan elemen tatasusunan.
(2) Gunakan gelung tertib terbalik
Penyelesaian lain ialah menggunakan gelung tertib terbalik. Kaedah ini boleh mengelakkan masalah perubahan subskrip semasa mengubah suai tatasusunan.
$array = [1, 2, 3, 4, 5]; foreach (array_reverse($array) as $key => $value) { if ($value == 3) { unset($array[count($array) - $key - 1]); } echo $value . " "; }
Dalam kod di atas, fungsi array_reverse digunakan untuk membalikkan tatasusunan dan operasi memadam dilakukan pada tatasusunan terbalik. Memandangkan subskrip selepas susunan terbalik adalah betul-betul bertentangan dengan subskrip tatasusunan asal, beberapa transformasi diperlukan apabila memadamkan elemen.
Ringkasnya, sama ada anda menyalin tatasusunan atau menggunakan gelung terbalik, anda boleh mengelakkan masalah perubahan panjang tatasusunan dalam gelung foreach dan memastikan hasil traversal yang betul.
4. Ringkasan
Apabila menggunakan gelung foreach untuk melintasi tatasusunan dalam PHP, anda perlu memberi perhatian kepada masalah bahawa menambah dan memadam elemen tatasusunan boleh menyebabkan panjang tatasusunan berubah. . Untuk mengelakkan masalah sedemikian, kaedah seperti menyalin tatasusunan atau menggunakan gelung terbalik boleh digunakan.
Atas ialah kandungan terperinci Bagaimana untuk menukar panjang tatasusunan dalam php foreach. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!