in_array beberapa nilai

110

Bagaimana cara memeriksa beberapa nilai, seperti:

$arg = array('foo','bar');

if(in_array('foo','bar',$arg))

Itu adalah contoh agar Anda mengerti sedikit lebih baik, saya tahu itu tidak akan berhasil.

daryl
sumber

Jawaban:

200

Persimpangan target dengan tumpukan jerami dan pastikan persimpangan tepat sama dengan target:

$haystack = array(...);

$target = array('foo', 'bar');

if(count(array_intersect($haystack, $target)) == count($target)){
    // all of $target is in $haystack
}

Perhatikan bahwa Anda hanya perlu memverifikasi bahwa ukuran perpotongan yang dihasilkan berukuran sama dengan larik nilai target untuk dikatakan $haystacksebagai superset $target.

Untuk memverifikasi bahwa setidaknya satu nilai $targetjuga masuk $haystack, Anda dapat melakukan pemeriksaan ini:

 if(count(array_intersect($haystack, $target)) > 0){
     // at least one of $target is in $haystack
 }
Mark Elliot
sumber
13
solusi ini bukan yang terbaik: $ needles = array (1,2); $ tumpukan jerami = larik (1,1,2,3); return (count (array_intersect ($ haystack, $ needles)) == count ($ needles)); ini akan mengembalikan palsu, itu tidak baik. Solusi Rok Kralj bagus untuk kasus ini.
ihtus
1
Saya pikir array tersebut harus menyimpan data unik dan jika tidak, solusi ini tidak akan berfungsi
Hashan Kanchana
182

Sebagai pengembang, Anda mungkin harus mulai mempelajari operasi set (perbedaan, gabungan, persimpangan). Anda dapat membayangkan array Anda sebagai satu "set", dan kunci yang Anda cari untuk yang lain.

Periksa apakah SEMUA jarum ada

function in_array_all($needles, $haystack) {
   return empty(array_diff($needles, $haystack));
}

echo in_array_all( [3,2,5], [5,8,3,1,2] ); // true, all 3, 2, 5 present
echo in_array_all( [3,2,5,9], [5,8,3,1,2] ); // false, since 9 is not present

Periksa apakah SALAH SATU jarum ada

function in_array_any($needles, $haystack) {
   return !empty(array_intersect($needles, $haystack));
}

echo in_array_any( [3,9], [5,8,3,1,2] ); // true, since 3 is present
echo in_array_any( [4,9], [5,8,3,1,2] ); // false, neither 4 nor 9 is present
Rok Kralj
sumber
9
Catatan: jenis deklarasi array ini adalah> = PHP 5.4
Claudiu Hojda
Solusi luar biasa asalkan Anda tidak perlu melakukan perbandingan yang ketat.
faintsignal
14
if(in_array('foo',$arg) && in_array('bar',$arg)){
    //both of them are in $arg
}

if(in_array('foo',$arg) || in_array('bar',$arg)){
    //at least one of them are in $arg
}
RiaD
sumber
7

Keluar dari jawaban @Rok Kralj (IMO terbaik) untuk memeriksa apakah ada jarum yang ada di tumpukan jerami, Anda dapat menggunakan (bool)alih-alih !!yang terkadang dapat membingungkan selama peninjauan kode.

function in_array_any($needles, $haystack) {
   return (bool)array_intersect($needles, $haystack);
}

echo in_array_any( array(3,9), array(5,8,3,1,2) ); // true, since 3 is present
echo in_array_any( array(4,9), array(5,8,3,1,2) ); // false, neither 4 nor 9 is present

https://glot.io/snippets/f7dhw4kmju

sMyles
sumber
9
Ini akan lebih berguna sebagai komentar atas jawaban Rok daripada sebagai jawaban baru.
faintsignal
@Jaymin bagaimana begitu (Anda memberikan detail NOL) ... bekerja dengan baik untuk saya glot.io/snippets/f7dhw4kmju
sMyles
@sMyles Saya telah mencoba menggunakan nilai string dalam array, bukan integer. Anda dapat mencoba sekali dari sisi Anda dan beri tahu saya.
Jaymin
@Jaymin masih belum memiliki masalah itu glot.io/snippets/f7dhw4kmju
sMyles
Ini bool konversi tidak cocok di sini sejak array_intersect mengembalikan array yang bisa kosong atau tidak kosong. Solusi @ rok-kralj adalah satu-satunya solusi yang disukai.
codelearner
3

Solusi IMHO Mark Elliot yang terbaik untuk masalah ini. Jika Anda perlu membuat operasi perbandingan yang lebih kompleks antara elemen array DAN Anda menggunakan PHP 5.3, Anda mungkin juga berpikir tentang sesuatu seperti berikut:

<?php

// First Array To Compare
$a1 = array('foo','bar','c');

// Target Array
$b1 = array('foo','bar');


// Evaluation Function - we pass guard and target array
$b=true;
$test = function($x) use (&$b, $b1) {
        if (!in_array($x,$b1)) {
                $b=false;
        }
};


// Actual Test on array (can be repeated with others, but guard 
// needs to be initialized again, due to by reference assignment above)
array_walk($a1, $test);
var_dump($b);

Ini bergantung pada penutupan; fungsi perbandingan bisa menjadi jauh lebih kuat. Semoga berhasil!

maraspin
sumber
Saya mengubah cara saya melakukan semuanya jadi pada hasil akhir saya tidak perlu melakukannya dengan cara apa pun, meskipun selalu baik untuk dipelajari, terima kasih atas masukan dan waktu Anda!
daryl
2
if(empty(array_intersect([21,22,23,24], $check_with_this)) {
 print "Not found even a single element";
} else {
 print "Found an element";
}

array_intersect () mengembalikan larik yang berisi semua nilai larik1 yang ada di semua argumen. Perhatikan bahwa kunci dipertahankan.

Mengembalikan larik yang berisi semua nilai dalam larik1 yang nilainya ada di semua parameter.


kosong () - Tentukan apakah suatu variabel kosong

Menampilkan FALSE jika var ada dan memiliki nilai bukan kosong, bukan nol. Jika tidak, mengembalikan TRUE.

Umesh Patil
sumber