Saya memiliki dua array dalam PHP sebagai berikut:
Orang-orang:
Array
(
[0] => 3
[1] => 20
)
Penjahat yang Dicari:
Array
(
[0] => 2
[1] => 4
[2] => 8
[3] => 11
[4] => 12
[5] => 13
[6] => 14
[7] => 15
[8] => 16
[9] => 17
[10] => 18
[11] => 19
[12] => 20
)
Bagaimana cara memeriksa apakah salah satu Orang elemen dalam Penjahat Dicari array yang?
Dalam contoh ini, itu harus kembali true
karena 20
ada di Wanted Criminals .
!empty
tidak berfungsi seperti yang diharapkan . Sebaliknya, saya menggunakancount()
:!count(array_intersect($people, $criminals));
Ada sedikit yang salah dengan menggunakan array_intersect () dan count () (bukan kosong).
Sebagai contoh:
sumber
count()
tidak dianggap berkinerja (jika Anda peduli dengan pengoptimalan mikro, itulah)jika 'kosong' bukan pilihan terbaik, bagaimana dengan ini:
atau
sumber
Kode itu tidak valid karena Anda hanya dapat mengirimkan variabel ke dalam konstruksi bahasa.
empty()
adalah konstruksi bahasa.Anda harus melakukan ini dalam dua baris:
sumber
Uji kinerja untuk in_array vs array_intersect:
Berikut hasilnya:
in_array setidaknya 5 kali lebih cepat. Perhatikan bahwa kami "istirahat" segera setelah hasilnya ditemukan.
sumber
array_intersect()
.isset
bahkan lebih cepat. Dan Anda dapat menggunakan bool val untuk mengaktifkan atau menonaktifkan. Juga nilai pencarian sebagai kunci pastikan tidak ada duplikat. ´array_intersect rata-rata: 0,52077736854553; in_array rata-rata: 0,015597295761108; rata-rata isset: 0,0077081203460693´Anda juga bisa menggunakan in_array sebagai berikut:
Meskipun array_intersect tentu lebih nyaman digunakan, ternyata performanya tidak terlalu unggul. Saya membuat skrip ini juga:
Kemudian, saya menjalankan kedua cuplikan di: http://3v4l.org/WGhO7/perf#tabs dan http://3v4l.org/g1Hnu/perf#tabs dan memeriksa kinerja masing-masing. Hal yang menarik adalah total waktu CPU, yaitu waktu pengguna + waktu sistem sama untuk PHP5.6 dan memori juga sama. Total waktu CPU di bawah PHP5.4 lebih sedikit untuk in_array daripada array_intersect, meskipun sedikit.
sumber
in_array
menerapkannya.Inilah cara saya melakukannya setelah menelitinya untuk sementara waktu. Saya ingin membuat titik akhir API Laravel yang memeriksa apakah suatu bidang "sedang digunakan", jadi informasi pentingnya adalah: 1) tabel DB yang mana? 2) apa kolom DB? dan 3) apakah ada nilai di kolom itu yang cocok dengan istilah pencarian?
Mengetahui hal ini, kita dapat membuat array asosiatif kita:
Kemudian, kita dapat menetapkan nilai yang akan kita periksa:
Kemudian, kita dapat menggunakan
array_key_exists()
danin_array()
dengan satu sama lain untuk mengeksekusi kombo satu, dua langkah dan kemudian bertindak berdasarkantruthy
kondisi:Saya minta maaf untuk kode PHP khusus Laravel, tetapi saya akan membiarkannya karena saya rasa Anda dapat membacanya sebagai kode semu. Bagian penting adalah dua
if
pernyataan yang dieksekusi secara sinkron.sumber:
https://php.net/manual/en/function.array-key-exists.php
https://php.net/manual/en/function.in-array.php
Yang menyenangkan tentang algoritma yang saya menunjukkan di atas adalah bahwa Anda dapat membuat endpoint SISA seperti
GET /in-use/{table}/{column}/{value}
(di manatable
,column
danvalue
adalah variabel).Kamu bisa saja:
dan kemudian Anda dapat membuat permintaan GET seperti:
GET /in-use/accounts/account_name/Bob's Drywall
(Anda mungkin perlu menyandikan uri bagian terakhir, tetapi biasanya tidak)GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/[email protected]
Perhatikan juga bahwa tidak ada yang bisa melakukan:
GET /in-use/users/password/dogmeat1337
karenapassword
tidak tercantum dalam daftar kolom yang diizinkan untukuser
.Semoga berhasil dalam perjalanan Anda.
sumber
$SEARCHABLE_TABLE_COLUMNS
! Ini berteriak untuk injeksi - tidak peduli apakah ada "pembuat kueri kerangka kerja yang sangat aman" antara yang mencoba untuk menutupi dan memfilter tabel dan string kolom! Di ujung tabel dan kolom, string tidak dapat ditambahkan melalui placeholder (pernyataan yang disiapkan) dan harus dimasukkan secara langsung sepertiSELECT ... FROM {$table} WHERE {$column} = :placeholder ....
. Ofc tergantung pada adaptor (mysql, mongo, ...) TAPI tidak ada alasan untuk menyelamatkan! Pls statis atau tidak ada daftar =)