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

I would like to find out if $all contains all $search_this values and return true or false. Any ideas please?

Blackbam
  • 14,898
  • 22
  • 85
  • 134
peter
  • 3,823
  • 10
  • 38
  • 65
  • 1
    Possible duplicate of [Checking to see if one array's elements are in another array in PHP](http://stackoverflow.com/questions/523796/checking-to-see-if-one-arrays-elements-are-in-another-array-in-php) – Vishal Kumar Sahu Apr 19 '17 at 10:01
  • 1
    @VishalKumarSahu Not quite a duplicate: Your given link has to do with checking if ANY elements are contained in another array, not if ALL elements are contained in another. – Stefan Jun 20 '17 at 15:15

5 Answers5

295

The previous answers are all doing more work than they need to. Just use array_diff. This is the simplest way to do it:

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

That's all you have to do.

Zanshin13
  • 821
  • 4
  • 19
  • 38
orrd
  • 8,689
  • 4
  • 36
  • 30
190

Look at array_intersect().

$containsSearch = count(array_intersect($search_this, $all)) === count($search_this);

Or for associative array, look at array_intersect_assoc().

Or for recursive compare of sub-arrays, try:

<?php

namespace App\helpers;

class Common {
    /**
     * Recursively checks whether $actual parameter includes $expected.
     *
     * @param array|mixed $expected Expected value pattern.
     * @param array|mixed $actual Real value.
     * @return bool
     */
    public static function intersectsDeep(&$expected, &$actual): bool {
        if (is_array($expected) && is_array($actual)) {
            foreach ($expected as $key => $value) {
                if (!static::intersectsDeep($value, $actual[$key])) {
                    return false;
                }
            }
            return true;
        } elseif (is_array($expected) || is_array($actual)) {
            return false;
        }
        return (string) $expected == (string) $actual;
    }
}
Top-Master
  • 5,262
  • 5
  • 23
  • 45
jasonbar
  • 12,945
  • 3
  • 36
  • 46
  • 13
    You know you can omit both `count()` calls? – Wrikken Aug 15 '13 at 16:01
  • 1
    @Wrikken Can't the values get reordered during `array_intersect()`? I mean, `['a', 'b'] != ['b', 'a']`. – sbichenko Oct 16 '13 at 18:57
  • 1
    @exizt: `array_intersect()` does not alter the input arrays, so `$search_this` & `$all` are safe (it just returns an output). The function signature is `array array_intersect ( array $array1 , array $array2 [, array $... ] )` (safe). If it would/could alter them, it would be `array array_intersect ( array &$array1 , array &$array2 [, array &$... ] )` (possible altering of input arguments). Also, the keys of `$search_this` are _preserve_, and the order of the first array is kept. So, both key/value pairs, as their order, match. – Wrikken Oct 16 '13 at 21:03
  • 4
    And even then: [array comparison](http://php.net/manual/en/language.operators.array.php): _"`==` TRUE if $a and $b have the same key/value pairs."_, so the order doesn't even matter (use `===` for that) – Wrikken Oct 16 '13 at 21:24
  • 2
    This answer assumes that the $all array only contains unique values. If this is not the case, one may use the array_unique function on the $all array in the array_intersects function. – Relequestual Dec 12 '13 at 21:49
  • 5
    array_diff solution @orrd gave is much cleaner – Joseph Connolly Apr 05 '18 at 18:29
14

A bit shorter with 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
  • 932
  • 1
  • 11
  • 20
4

I think you're looking for the intersect function

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

array_intersect() returns an array containing all values of array1 that are present in all the arguments. Note that keys are preserved.

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

shA.t
  • 15,880
  • 5
  • 49
  • 104
James Kyburz
  • 12,741
  • 1
  • 31
  • 33
0

How about this:

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

    return count(array_intersect($searchForKeys, $searchableArrayKeys)) == count($searchForKeys); 
}
MaartenDev
  • 5,093
  • 5
  • 20
  • 31
K-Alex
  • 350
  • 1
  • 3
  • 17