Saya ingin mendapatkan huruf pertama dari sebuah string dan saya perhatikan itu $str[0]
sangat bagus. Saya hanya tidak yakin apakah ini 'praktik yang baik', karena notasi itu umumnya digunakan dengan array. Fitur ini sepertinya tidak terdokumentasi dengan baik jadi saya beralih kepada kalian untuk memberi tahu saya apakah boleh - dalam segala hal - untuk menggunakan notasi ini?
Atau haruskah saya tetap berpegang pada kebaikan substr($str, 0, 1)
?
Juga, saya perhatikan bahwa kurung kurawal ( $str{0}
) berfungsi juga. Ada apa dengan itu?
Jawaban:
Iya. String dapat dilihat sebagai array karakter, dan cara untuk mengakses posisi array adalah dengan menggunakan
[]
operator. Biasanya tidak ada masalah sama sekali dalam menggunakan$str[0]
(dan saya cukup yakin ini jauh lebih cepat daripadasubstr()
metode).Hanya ada satu peringatan dengan kedua metode: mereka akan mendapatkan byte pertama , bukan karakter pertama . Ini penting jika Anda menggunakan penyandian multibyte (seperti UTF-8). Jika Anda ingin mendukungnya, gunakan
mb_substr()
. Boleh dibilang, Anda harus selalu mengasumsikan input multibyte hari ini, jadi ini adalah pilihan terbaik , tetapi akan sedikit lebih lambat.sumber
mb_substr($str, 0, 1, 'utf-8')
sehingga Anda tidak memotong string multibyte.substr($str, 0, 1)
, ini membingungkan siapa yang membaca kode.Sintaks {} tidak digunakan pada PHP 5.3.0. Kurung kotak direkomendasikan.
sumber
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose. However, this syntax is deprecated as of PHP 5.3.0. Use square brackets instead, such as $str[42].
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
Jadi saya bertanya-tanya apakah mereka memutuskan bahwa penggunaan{}
TIDAK ditinggalkan lagi pada PHP 6The curly-brackets-string-index-accessor-syntax does not emit any deprecation notice, although the original notice have been on and off for PHP 5.x, it does not in the current version, thrus we should not label it as deprecated. Related to bug #52254
- svn.php.net/repository/phpdoc/en/trunk/language/language/…Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
Sepertinya sintaks ini akan tetap untuk sementara waktu.Katakanlah Anda hanya ingin char pertama dari bagian $ _POST, sebut saja 'ketik'. Dan $ _POST ['type'] saat ini 'Control'. Jika dalam hal ini jika Anda gunakan
$_POST['type'][0]
, atausubstr($_POST['type'], 0, 1)
Anda akanC
kembali.Namun, jika sisi klien adalah untuk memodifikasi data mereka mengirimkan, dari
type
ketype[]
misalnya, dan kemudian mengirim 'Control' dan 'Test' sebagai data untuk array ini,$_POST['type'][0]
sekarang akan kembaliControl
daripadaC
sedangkansubstr($_POST['type'], 0, 1)
hanya akan hanya gagal.Jadi ya, mungkin ada masalah dengan penggunaan
$str[0]
, tetapi itu tergantung pada keadaan di sekitarnya.sumber
if (true === is_string($_POST['type']))
Satu-satunya keraguan saya adalah seberapa bisa diterapkan teknik ini pada string multi-byte, tetapi jika itu bukan pertimbangan, maka saya curiga Anda dilindungi. (Jika ragu,
mb_substr()
tampaknya pilihan yang jelas aman.)Namun, dari perspektif gambaran besar, saya harus bertanya-tanya seberapa sering Anda perlu mengakses karakter ke-n dalam sebuah string agar ini menjadi pertimbangan utama.
sumber
Ini akan bervariasi tergantung pada sumber daya, tetapi Anda dapat menjalankan skrip di bawah dan lihat sendiri;)
Beberapa nomor referensi (pada mesin CoreDuo lama)
Tampaknya menggunakan
[]
atau{}
operator kurang lebih sama.sumber
testA
dantestB
dalam loop yang sama berarti Anda mampu mendeteksi mis. fakta bahwa itutestB
adalah pembunuh-cache sementaratestA
ramah-cache. Ketika keduanya berada di loop yang sama, mereka diukur memiliki timing yang sama karena caching yangtestB
tercemartestA
.microtime()
panggilan akan membuat sebagian besar perbedaan waktu, meskipun secara eksperimental yang tampaknya menjadi tidak benar), tidak ada alasan untuk peduli tentang perbedaan kecepatan kecil di sini. Ini sepersekian dari sepersejuta detik; kapan ini pernah akan menjadi masalah?Berbicara sebagai manusia biasa, saya akan tetap dengan
$str[0]
. Sejauh yang saya ketahui, lebih cepat untuk memahami arti dari$str[0]
sekilas daripadasubstr($str, 0, 1)
. Ini mungkin bermuara pada masalah preferensi.Sejauh kinerja berjalan, baik, profil profil profil. :) Atau Anda dapat mengintip kode sumber PHP ...
sumber
sumber
Dalam kasus penggunaan string multibyte (unicode)
str[0]
dapat menyebabkan masalah.mb_substr()
adalah solusi yang lebih baik. Sebagai contoh:Beberapa detail di sini: Dapatkan karakter pertama dari string UTF-8
sumber
Saya telah menggunakan notasi itu sebelumnya, tanpa efek samping yang buruk dan tidak ada kesalahpahaman. Masuk akal - string hanyalah array karakter, setelah semua.
sumber
$str[42]
. Pikirkan string sebagai array karakter untuk tujuan ini. Secara internal, string PHP adalah array byte.$arr[] = $new_element
) tidak berfungsi pada string. Karena itu, saya tidak berpikir memahami string sebagai array karakter berguna.