Rumah >pembangunan bahagian belakang >masalah PHP >Tidak bolehkah subskrip tatasusunan bersekutu dalam PHP menjadi rentetan kosong atau jenis angka?

Tidak bolehkah subskrip tatasusunan bersekutu dalam PHP menjadi rentetan kosong atau jenis angka?

PHPz
PHPzasal
2023-04-23 10:08:32611semak imbas

Dalam PHP, tatasusunan ialah jenis data yang sangat penting, yang boleh menyimpan berbilang nilai jenis data yang sama dan boleh menggunakan indeks yang berbeza untuk mengakses nilai ini. Antaranya, tatasusunan bersekutu ialah jenis tatasusunan yang biasa digunakan, yang menggunakan rentetan sebagai nama kunci untuk menyimpan dan mengakses nilai dalam tatasusunan. Walau bagaimanapun, apabila menggunakan tatasusunan bersekutu, anda perlu memberi perhatian kepada perkara yang sangat penting: subskrip tatasusunan tidak boleh berupa rentetan kosong atau jenis angka.

Subskrip tatasusunan bersekutu dikenal pasti dengan rentetan dan rentetan ini mempunyai keperluan tertentu. Pertama, ia mestilah unik dan tidak boleh diulang kedua, ia mestilah daripada jenis rentetan. Jika kita menggunakan rentetan kosong atau jenis berangka sebagai subskrip tatasusunan, ia akan menyebabkan ralat apabila program sedang berjalan atau mengembalikan hasil yang tidak dijangka.

Soalan 1: Subskrip tatasusunan ialah rentetan kosong

Bayangkan, apakah yang akan berlaku jika kita menggunakan rentetan kosong sebagai subskrip tatasusunan? Mari cuba:

$arr = array(
    '' => 'empty_key',
    'test' => 'test_value'
);

echo $arr['']; // 输出:empty_key

Seperti yang anda lihat, kami berjaya menentukan rentetan kosong sebagai subskrip tatasusunan dan nilai yang sepadan boleh diakses melalui subskrip ini. Jadi, apa masalahnya?

Apabila kami menggunakan rentetan kosong sebagai subskrip tatasusunan, kami sebenarnya menukarnya kepada 0 jenis integer. Ini kerana, dalam PHP, rentetan kosong dianggap sebagai 0, dan apabila anda perlu menukarnya kepada jenis integer, anda akan mendapat hasil 0. Oleh itu, apabila kita menggunakan rentetan kosong sebagai subskrip tatasusunan, ia sebenarnya bersamaan dengan menggunakan integer 0 sebagai subskrip, yang mungkin membawa kepada beberapa kelakuan aneh.

Sebagai contoh, kita boleh cuba menggunakan gelung for untuk melintasi tatasusunan bersekutu ini:

$arr = array(
    '' => 'empty_key',
    'test' => 'test_value'
);

for($i=0; $i<count($arr); $i++){
    echo $arr[$i]."\n";
}

Hasil yang kami harap dapat ialah:

empty_key
test_value

Tetapi sebenarnya, program Amaran akan dilemparkan dan output:

PHP Notice:  Undefined offset: 1
empty_key

Mesej amaran memberitahu kita bahawa elemen dengan indeks tatasusunan 1 tidak ditentukan. Ini kerana apabila kita menggunakan pembolehubah pembilang $i untuk melintasi tatasusunan, nilai awal $i ialah 0, yang ditukar kepada jenis rentetan '', jadi kita mengakses elemen dengan indeks tatasusunan '' . Selepas merentasi elemen ini, nilai $i dinaikkan sebanyak 1 dan menjadi 1, tetapi 1 ini ditukar kepada jenis integer 1, dan dalam tatasusunan ini, elemen dengan subskrip 1 sebenarnya tidak wujud Jadi program memberi amaran dan output rentetan kosong.

Soalan 2: Subskrip tatasusunan ialah jenis angka

Serupa dengan rentetan kosong, kita juga harus mengelak daripada menggunakan jenis angka sebagai subskrip tatasusunan. Bayangkan, apa yang akan berlaku jika kita menggunakan jenis angka sebagai subskrip tatasusunan? Mari cuba:

$arr = array(
    1 => 'one',
    2 => 'two',
    3 => 'three'
);

echo $arr[1]; // 输出:one

Seperti yang anda lihat, kami telah berjaya menentukan nombor 1, 2, dan 3 sebagai subskrip tatasusunan, dan nilai yang sepadan boleh diakses melalui subskrip ini. Jadi, apa masalahnya?

Apabila kami menggunakan jenis angka sebagai subskrip tatasusunan, nombor itu akan ditukar secara automatik kepada jenis integer. Ini mungkin kelihatan seperti tiada masalah, tetapi sebenarnya, ia boleh menyebabkan beberapa masalah tersembunyi.

Sebagai contoh, kita boleh cuba menggunakan gelung foreach untuk melintasi tatasusunan bersekutu ini:

$arr = array(
    1 => 'one',
    2 => 'two',
    3 => 'three'
);

foreach($arr as $key => $value){
    echo $key.' => '.$value."\n";
}

Hasil yang kami harap dapat ialah:

1 => one
2 => two
3 => three

Tetapi sebenarnya, atur cara Ia akan mengeluarkan:

0 => one
1 => two
2 => three

Seperti yang anda lihat, hasil keluaran oleh atur cara tidak sepadan dengan hasil yang kita inginkan. Ini kerana, dalam gelung foreach, PHP mengisih subskrip tatasusunan mengikut saiz berangka dan secara automatik menukarnya kepada jenis integer. Dalam contoh ini, kami telah mentakrifkan tiga subskrip jenis angka, iaitu 1, 2 dan 3, jadi ia akan ditukar secara automatik kepada jenis integer 1, 2 dan 3, dan kemudian disusun mengikut saiz. Oleh itu, dalam program ini, nilai $key masing-masing ialah 0, 1, dan 2, yang sama sekali tidak konsisten dengan subskrip yang kami takrifkan. Ini boleh menyebabkan masalah apabila program mengendalikan tatasusunan.

Penyelesaian

Untuk mengelakkan situasi di mana data tidak memenuhi jangkaan, kita harus mengelak daripada menggunakan rentetan kosong atau jenis angka sebagai subskrip dalam tatasusunan bersekutu. Jika kita benar-benar perlu menggunakan subskrip berangka, kita boleh menukarnya kepada jenis rentetan sebelum menggunakannya, yang akan memastikan bahawa masalah di atas dapat dielakkan.

Sebagai contoh, kita boleh membungkus subskrip yang mentakrifkan jenis angka dalam petikan untuk menukarnya kepada jenis rentetan:

$arr = array(
    '1' => 'one',
    '2' => 'two',
    '3' => 'three'
);

Dengan cara ini, kita boleh menggunakan jenis angka dengan selamat Bida telah dibuat. Walau bagaimanapun, perlu diingatkan bahawa apabila menggunakan kaedah ini, anda perlu memastikan bahawa semua subskrip adalah unik, tanpa mengira jenisnya. Hanya dengan cara ini kami boleh memastikan program berjalan seperti biasa dan data memenuhi jangkaan kami.

Ringkasan

Dalam PHP, tatasusunan bersekutu ialah jenis data yang sangat biasa digunakan, yang boleh menyimpan sejumlah besar data dan mengakses data ini menggunakan pasangan nilai kunci. Walau bagaimanapun, kita perlu memberi perhatian kepada isu penting: subskrip tatasusunan tidak boleh menjadi rentetan kosong atau jenis angka. Jika kami menggunakan jenis subskrip ini secara tidak sengaja, ia mungkin menyebabkan ralat semasa program berjalan atau mengembalikan hasil yang tidak dijangka. Oleh itu, apabila menggunakan tatasusunan bersekutu, kita perlu sentiasa memberi perhatian kepada masalah ini dan mengambil langkah yang sewajarnya untuk mengelakkan ia berlaku.

Atas ialah kandungan terperinci Tidak bolehkah subskrip tatasusunan bersekutu dalam PHP menjadi rentetan kosong atau jenis angka?. 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