Karakter diperbolehkan dalam kunci array php?

86

Saya memiliki beberapa kunci array php yang diisi dengan banyak karakter aneh.

Apakah ini diperbolehkan? Apakah ada batasan untuk apa yang tidak dapat saya gunakan?

cgwebprojects
sumber
Batasan:$a = (object) ['@km³' => 123]; error_log($a->@km³);
Bitterblue

Jawaban:

90

Menurut manual :

Kuncinya bisa berupa integer atau string. Nilainya bisa dari jenis apa pun.

Selain itu, pemeran kunci berikut akan terjadi:

  • String yang berisi bilangan bulat yang valid akan dimasukkan ke jenis bilangan bulat. Misalnya, kunci "8" sebenarnya akan disimpan di bawah 8. Di sisi lain "08" tidak akan dilemparkan, karena ini bukan bilangan bulat desimal yang valid.
  • Float juga dilemparkan menjadi integer, yang berarti bagian pecahan akan dipotong. Misalnya, kunci 8.7 sebenarnya akan disimpan di bawah 8.
  • Bools juga diubah menjadi integer, yaitu key true akan disimpan di bawah 1 dan key false di bawah 0.
  • Null akan dilemparkan ke string kosong, yaitu kunci null sebenarnya akan disimpan di bawah "".
  • Array dan objek tidak dapat digunakan sebagai kunci. Melakukannya akan menghasilkan peringatan: Jenis offset ilegal.

Manual lagi :

String adalah rangkaian karakter, di mana karakter sama dengan byte. Ini berarti bahwa PHP hanya mendukung kumpulan 256 karakter, dan karenanya tidak menawarkan dukungan Unicode asli. Lihat detail tipe string.

Jadi singkatnya, string apa pun bisa menjadi kunci. Dan string dapat berisi data biner apa pun (hingga 2GB). Oleh karena itu, kunci dapat berupa data biner apa pun (karena string dapat berupa data biner apa pun).

Beberapa penyalahgunaan kunci array secara acak (valid):

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);
Corbin
sumber
1
Untuk memperjelas, itu tidak berarti Anda tidak dapat menggunakan string Unicode sebagai kunci array. Faktanya, string biner apa pun berfungsi dengan baik. Saya menemukan kurangnya dukungan Unicode yang dijelaskan sendiri oleh PHP menjengkelkan, karena itu tidak benar. :)
menipu
1
@deceze Unicode termasuk dalam kategori "data biner apa pun" :) (meskipun saya kira dengan kata-kata manual, saya kira klarifikasi itu diperlukan). Dan mengatakan "tidak menawarkan dukungan Unicode asli" cukup benar. Ada inti PHP tidak menyertakan versi Unicode dari strlen, substr, dll. Meskipun "tidak menawarkan pemrosesan asli string Unicode" mungkin lebih tepat.
Corbin
3
Tentu, inti tidak berisi fasilitas apa pun untuk memanipulasi string Unicode. Tetapi selama Anda tidak ingin memanipulasi string, PHP mendukungnya dengan baik. Dan secara realistis, ekstensi MB tersedia di hampir setiap instalasi PHP secara default, jadi perbedaan antara "dukungan inti" atau tidak sebagian besar bersifat akademis. :)
menipu
1
@deceze mungkin catatan mereka harus dibaca "bukan aslinya (lihat ekstensi mb)" atau semacamnya. Kamu benar. Setiap instalasi PHP sejak 2005 pada dasarnya mendukung Unicode, meskipun saya berpendapat bahwa dukungan Unicode di PHP (dengan ekstensi) masih sedikit tidak menyenangkan.
Corbin
@ Corbin, mengapa Anda menyebut penyalahgunaan itu alih-alih penggunaan ?
Pacerier
12

Kuncinya harus berupa string atau integer. Ada beberapa pemeran yang dilakukan, tapi menurut saya manual ini menjelaskan dengan baik:

Kuncinya bisa berupa integer atau string. Nilainya bisa dari jenis apa pun.

Selain itu, pemeran kunci berikut akan terjadi:

  • String yang berisi bilangan bulat yang valid akan dimasukkan ke jenis bilangan bulat. Misalnya, kunci "8" sebenarnya akan disimpan di bawah 8. Di sisi lain "08" tidak akan dilemparkan, karena ini bukan bilangan bulat desimal yang valid.
  • Float juga dilemparkan menjadi integer, yang berarti bagian pecahan akan dipotong. Misalnya, kunci 8.7 sebenarnya akan disimpan di bawah 8.
  • Bools juga diubah menjadi integer, yaitu key true akan disimpan di bawah 1 dan key false di bawah 0.
  • Null akan dilemparkan ke string kosong, yaitu kunci null sebenarnya akan disimpan di bawah "".
  • Array dan objek tidak dapat digunakan sebagai kunci. Melakukannya akan menghasilkan peringatan: Jenis offset ilegal.
Matthew
sumber
Jenis sumber daya dapat dikirim ke integer sekarang (tidak yakin apakah ini fitur baru), jadi Anda dapat menggunakan misalnya pegangan file atau pegangan curl sebagai kunci secara tidak langsung dengan mentransmisikannya ke integer dan menggunakannya sebagai kunci.
thomasrutter
10

Saya menemukan jawaban ini untuk mencari informasi lebih lanjut tentang masalah yang saya hadapi. Saya menggunakan string dengan karakter UTF-8 di dalamnya, yang tidak akan berfungsi sebagai kunci untuk array yang saya miliki.

Sesuatu seperti

$str = "R&D - Solution";
$arr = array( "R&D - Solution" => "Research" );
echo $arr[$str];  // did not work

Solusi (tidak besar atau pintar) bagi saya adalah melakukan ini ..

$str = md5("R&D - Solution");
$arr = array( md5("R&D - Solution") => "Research" );
echo $arr[$str];  // works!
rampok
sumber
2
Saya suka md5 () untuk menghasilkan kunci array. Meskipun tidak sepenuhnya diperlukan pada saat ini, ini masih terasa lebih aman.
billynoah
2
Apakah Anda menggunakan PHP versi lama? Contoh pertama Anda berfungsi dengan baik di PHP 7.1.
Elliot B.
bin2hexlebih baik digunakan sebagai kunci karena dijamin unik, tidak seperti md5dan akan selalu kembali ke aslinya dengan menggunakan hex2bin. Mungkin lebih cepat dari md5juga.
Patanjali
6

Kunci array PHP dapat berupa bilangan bulat atau string. String PHP adalah array byte, yang berarti urutan byte. Tidak ada jenis string lain dan PHP tidak memaksakan batasan khusus pada string kunci array. Dengan kata lain: selama itu string, apapun itu.

menipu
sumber
Saya pikir cast implisit dari string ke kunci integer adalah perbedaan penting yang harus dibuat, karena fungsi tertentu beroperasi secara berbeda jika kuncinya adalah integer atau bukan. Misalnya, Anda dapat menggunakan nomor string arbitrer hanya untuk menemukan bahwa fungsi array kemudian mengindeks ulang dari 0..n-1.
Matius
1
Setuju, tapi menurut saya itu berada di batas cakupan pertanyaan ini. :)
menipu
5

Apa pun yang Anda bisa masukkan ke dalam string PHP dapat digunakan sebagai kunci array. Tidak ada batasan karakter yang diperbolehkan.

$a = array();

$x = 'long string of random garage';
echo $a[$x]; // this is ok

$x = array();
echo $a[$x]; // not ok
Marc B
sumber
1

Jika kunci kompleks menyebabkan kesalahan "indeks tidak terdefinisi", Anda mungkin hanya mengalami masalah "pangkas".

Saya menjadi gila karena kunci yang kompleks mengeluarkan kesalahan "indeks tidak terdefinisi" dan saya pikir mungkin itu adalah pelanggaran sintaks. Kunci array yang menyebabkan kesalahan dibangun dari kolom dari kueri database MySQL yang saya ubah menjadi kunci dan digunakan dalam array baru. Kuncinya terlihat seperti ini: pl_1DNKoiJKwotCqAycickBVhTydan beginilah kode itu dibuat.

//new array created from database query
$new_array[$dbquery['fieldname']] = {some value};

//key value found in field of second array
$keyval = $array_two['fieldname'];

//this produced the "undefined index" error
echo $new_array[$keyval];

padahal, pada kenyataannya, $keyvaldan $dbquery['fieldname']tampaknya merupakan pasangan yang sempurna (diverifikasi secara visual dengan menggemakan keduanya ke browser). Misteri itu dipecahkan hanya dengan menggunakan trimpernyataan kedua seperti ini: $keyval = trim($array_two['fieldname']);Setelah 'dipangkas', php tidak lagi mengeluh.

Berharap ini menyelamatkan beberapa orang lain dari beberapa saat yang membuat frustrasi ...

globalSchmidt
sumber
0

Saya pribadi tidak punya masalah dengan karakter yang tidak biasa dalam kunci array. Apa yang legal dan tidak legal tidak terdokumentasi dengan baik, selain mengatakan bahwa kuncinya harus skalar. Taruhan terbaik Anda adalah mencobanya dan melihatnya.

GordonM
sumber
Agak tidak konsisten, ya, tetapi didokumentasikan dengan baik.
Corbin
0

Selain semua jawaban karena benar: Anda dapat menggunakan PSR bahwa itu adalah semacam aturan antara programmer terbaik untuk memiliki gaya pengkodean yang bagus dan standar.

VeRJiL
sumber
0

Dalam array php Anda tidak dapat menggunakan kunci: 2.3 atau angka desimal

abhishek92.dll
sumber
-1

Encode halaman php di ANSI "é" akan dapat digunakan (Cinéma tidak akan muncul sebagai Cinà © ma). Di Notepad ++ cukup gunakan menu Encode => Convert ANSI dan simpan

Luar biasa
sumber
2
(Posting ini tampaknya tidak memberikan jawaban berkualitas untuk pertanyaan. Harap edit jawaban Anda, atau posting saja sebagai komentar untuk pertanyaan).
sɐunıɔ ןɐ qɐp
Bisakah Anda menjelaskannya lebih lanjut? Bagaimana jika étidak ada, bagaimana jika OP tidak menggunakan Notepad ++ sama sekali?
Nico Haase