Anehnya array_keys_existtidak ada ?! Untuk sementara yang menyisakan ruang untuk mencari ekspresi baris tunggal untuk tugas umum ini. Saya sedang memikirkan skrip shell atau program kecil lainnya.
Catatan: setiap solusi berikut menggunakan […]sintaks deklarasi larik ringkas yang tersedia di php 5.4+
if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
} else {
}
(tip topi untuk Kim Stacks )
Pendekatan ini adalah yang paling singkat yang saya temukan. array_diff()mengembalikan larik item yang ada dalam argumen 1 tidak ada dalam argumen2. Oleh karena itu, array kosong menunjukkan semua kunci ditemukan. Di php 5.5 Anda bisa menyederhanakan 0 === count(…)menjadi sederhana empty(…).
if (0 === count(array_reduce(array_keys($source),
function($in, $key){ unset($in[array_search($key, $in)]); return $in; },
['story', 'message', '…'])))
{
} else {
}
Lebih sulit dibaca, mudah diubah. array_reduce()menggunakan callback untuk mengulangi larik untuk mendapatkan nilai. Dengan memberi makan kunci yang kita minati $initialnilainya $indan kemudian menghapus kunci yang ditemukan di source, kita dapat berharap untuk mengakhiri dengan 0 elemen jika semua kunci ditemukan.
Konstruksinya mudah dimodifikasi karena tombol yang kami minati pas dengan baik.
if (2 === count(array_filter(array_keys($source), function($key) {
return in_array($key, ['story', 'message']); }
)))
{
} else {
}
Lebih sederhana untuk menulis daripada array_reducesolusinya tetapi sedikit lebih sulit untuk diedit. array_filterjuga merupakan callback berulang yang memungkinkan Anda membuat array yang difilter dengan mengembalikan true (salin item ke array baru) atau false (jangan salin) di callback. Gotchya adalah Anda harus mengubah 2jumlah item yang Anda harapkan.
Ini dapat dibuat lebih tahan lama tetapi hampir pada keterbacaan yang tidak masuk akal:
$find = ['story', 'message'];
if (count($find) === count(array_filter(array_keys($source), function($key) use ($find) { return in_array($key, $find); })))
{
} else {
}