php memeriksa apakah array berisi semua nilai array dari array lain

110
$all = array
(
    0 => 307,
    1 => 157,
    2 => 234,
    3 => 200,
    4 => 322,
    5 => 324
);
$search_this = array
(
    0 => 200,
    1 => 234
);

Saya ingin mengetahui apakah $ all berisi semua $ search_this values ​​dan mengembalikan true atau false. ada ide, tolong?

peter
sumber
@VishalKumarSahu Bukan duplikat: Tautan yang Anda berikan berkaitan dengan memeriksa apakah ada elemen yang terkandung dalam larik lain, bukan jika SEMUA elemen ada di larik lain.
Stefan

Jawaban:

159

Lihatlah array_intersect () .

$containsSearch = count(array_intersect($search_this, $all)) == count($search_this);
jasonbar
sumber
11
Anda tahu Anda bisa menghilangkan kedua count()panggilan?
Wrikken
1
@Wrikken Tidak dapat mengatur ulang nilai selama array_intersect()? Maksud saya ['a', 'b'] != ['b', 'a'],.
sbichenko
4
Dan bahkan kemudian: perbandingan larik : " ==BENAR jika $ a dan $ b memiliki pasangan kunci / nilai yang sama." , jadi urutannya bahkan tidak penting (gunakan ===untuk itu)
Wrikken
2
Jawaban ini mengasumsikan bahwa $ all array hanya berisi nilai unik. Jika ini bukan masalahnya, seseorang dapat menggunakan fungsi array_unique pada $ all array dalam fungsi array_intersects.
Relequest
5
solusi array_diff @orrd memberi jauh lebih bersih
Joseph Connolly
223

Jawaban sebelumnya semuanya melakukan lebih banyak pekerjaan daripada yang mereka butuhkan. Cukup gunakan array_diff . Ini adalah cara termudah untuk melakukannya:

$containsAllValues = !array_diff($search_this, $all);

Hanya itu yang harus Anda lakukan.

orrd
sumber
4
Terima kasih untuk momen aha; Saya datang berpikir array_intersect.
Derek Illchuk
19
ini harus menjadi jawabannya
Matius
2
Ya, itu solusi yang lebih baik
Oleksandr Diudiun
1
Solusi yang lebih baik daripada berpotongan!
TheBosti
1
Saya menemukan halaman ini dan menggunakan solusi di atas karena memperhitungkan duplikat
Rayzor
9

Sedikit lebih pendek dengan array_diff

$musthave = array('a','b');
$test1 = array('a','b','c');
$test2 = array('a','c');

$containsAllNeeded = 0 == count(array_diff($musthave, $test1));

// this is TRUE

$containsAllNeeded = 0 == count(array_diff($musthave, $test2));

// this is FALSE
javigzz
sumber
3

Saya pikir Anda sedang mencari fungsi perpotongan

array array_intersect ( array $array1 , array $array2 [, array $ ... ] )

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

http://www.php.net/manual/en/function.array-intersect.php

James Kyburz
sumber
0

Bagaimana dengan ini:

function array_keys_exist($searchForKeys = array(), $searchableArray) {
    $searchableArrayKeys = array_keys($searchableArray);

    return count(array_intersect($searchForKeys, $searchableArrayKeys)) == count($searchForKeys); 
}
K-Alex
sumber