$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);
kembali
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
Saya membutuhkan nilai-nilai untuk menjadi tipe int bukan tipe string. Apakah ada cara yang lebih baik untuk melakukan ini daripada mengulang melalui array dengan foreach dan mengubah setiap string ke int?
Ini hampir 3 kali lebih cepat daripada
explode()
,array_map()
danintval()
:sumber
Jadi saya ingin tahu tentang kinerja beberapa metode yang disebutkan dalam jawaban untuk sejumlah besar bilangan bulat.
Persiapan
Hanya membuat array 1 juta bilangan bulat acak antara 0 dan 100. Lalu, saya membuat mereka untuk mendapatkan string.
Metode 1
Ini adalah satu kalimat dari jawaban Markus:
Metode 2
Ini adalah pendekatan JSON:
Metode 3
Saya datang dengan yang ini sebagai modifikasi dari jawaban Markus. Ini masih menggunakan
explode()
fungsi, tetapi alih-alih memanggilarray_map()
saya menggunakanforeach
loop biasa untuk melakukan pekerjaan untuk menghindari overhead yangarray_map()
mungkin terjadi. Saya juga parsing dengan(int)
vsintval()
, tetapi saya mencoba keduanya, dan tidak ada banyak perbedaan dalam hal kinerja.Hasil:
Intinya adalah rata-rata. Sepertinya metode pertama sedikit lebih lambat untuk 1 juta bilangan bulat, tapi saya tidak melihat peningkatan kinerja 3x dari Metode 2 seperti yang dinyatakan dalam jawaban. Ternyata
foreach
loop adalah yang tercepat dalam kasus saya. Saya telah melakukan pembandingan dengan Xdebug.Sunting: Sudah lama sejak jawaban awalnya diposting. Untuk memperjelas, benchmark dilakukan di php 5.6.
sumber
array_map(function($v){ return (int)$v; }, $strings_array);
inilah yang saya maksudGunakan kode ini dengan penutup (diperkenalkan pada
PHP 5.3
), ini sedikit lebih cepat dari jawaban yang diterima dan bagi saya, niat untuk melemparkannya ke integer, lebih jelas:Output akan menjadi:
sumber
Dalam solusi Mark, Anda akan kembali
array([0]=> int 0)
jika Anda mencoba mengurai string seperti "test".sumber
Tidak yakin apakah ini lebih cepat tetapi membalik array dua kali akan memberikan string numerik ke integer:
sumber
Metode alternatif yang lebih pendek bisa berupa:
Ini memiliki kinerja yang sama dengan Metode 3.
sumber
Jika Anda memiliki array seperti:
Dan jika Anda ingin menyamarkannya menjadi bilangan bulat dan tetap berada di dalam array, hal-hal berikut harus dilakukan:
sumber
Solusi saya adalah casting setiap nilai dengan bantuan fungsi callback:
sumber
Sederhana saja ...
Mengapa Anda mencari cara lain? Looping melakukan pekerjaan tanpa rasa sakit. Jika kinerja menjadi perhatian Anda, Anda dapat melakukannya
json_decode ()
. Orang-orang telah memposting cara menggunakannya, jadi saya tidak memasukkannya di sini.Catatan: Saat menggunakan operator == alih-alih ===, nilai string Anda secara otomatis dikonversi menjadi angka (mis. Integer atau dobel) jika mereka membentuk angka yang valid tanpa tanda kutip. Sebagai contoh:
Dengan demikian, == dapat menyelesaikan masalah Anda, efisien, tetapi akan pecah jika Anda menggunakan === dalam perbandingan.
sumber
Jika Anda memiliki array multi-dimensi, tidak satu pun dari solusi yang disebutkan sebelumnya akan berfungsi. Ini solusinya:
Kemudian, lakukan ini:
Ini akan membuat array seperti ini:
terlihat seperti ini:
(Ini akan bekerja dengan tingkat kedalaman apa pun)
sumber
Anda dapat mengonversi nilai dalam array:
Anda juga dapat mengembalikan nilai kembali
explode
fungsi ke$strings
dan beralih bukan menggunakan variabel lain ($ id).Saya pikir solusi ini adalah cara teraman dengan kinerja terbaik.
sumber
Gaya PHP 7.4:
sumber
Input => '["3", "6", "16", "120"]'
Jenis konversi yang saya gunakan => (int) $ s;
Keluaran:
Terima kasih
sumber