php проверить, содержит ли массив все значения массива из другого массива

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

Я хотел бы узнать, содержит ли $ all все значения $ search_this и вернуть true или false. любая идея, пожалуйста?

Питер
источник
@VishalKumarSahu Не совсем дубликат: данная ссылка имеет отношение к проверке, содержатся ли ЛЮБЫЕ элементы в другом массиве, а не ВСЕ элементы содержатся в другом.
Стефан

Ответы:

159

Посмотрите на array_intersect () .

$containsSearch = count(array_intersect($search_this, $all)) == count($search_this);
Джейсонбар
источник
11
Вы знаете, что можете пропустить оба count()вызова?
Wrikken
1
@Wrikken Невозможно изменить порядок значений во время array_intersect()? Я имею ввиду ['a', 'b'] != ['b', 'a'].
сбиченко
4
И даже тогда: сравнение массивов : « ==ИСТИНА, если $ a и $ b имеют одинаковые пары ключ / значение». , так что порядок даже не имеет значения (используйте ===для этого)
Wrikken
2
Этот ответ предполагает, что массив $ all содержит только уникальные значения. Если это не так, можно использовать функцию array_unique для массива $ all в функции array_intersects.
Relequestual
5
Решение array_diff, которое дал @orrd, намного чище
Джозеф Коннолли
224

Все предыдущие ответы делают больше работы, чем им нужно. Просто используйте array_diff . Это самый простой способ сделать это:

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

Это все, что вам нужно сделать.

Orrd
источник
5
Спасибо за момент ага; Я пришел в себя array_intersect.
Дерек Ильчук 04
19
это должен быть ответ
Мэтью
2
Да, это такое лучшее решение
Александр Диудюн
1
Лучшее решение, чем пересечение!
TheBosti
1
Я наткнулся на эту страницу и использовал вышеуказанное решение, потому что на нем были дубликаты
Rayzor
9

Немного короче с 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
источник
3

Я думаю, вы ищете функцию пересечения

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

array_intersect()возвращает массив, содержащий все значения массива 1, которые присутствуют во всех аргументах. Обратите внимание, что ключи сохранены.

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

Джеймс Кибурз
источник
0

Как насчет этого:

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

    return count(array_intersect($searchForKeys, $searchableArrayKeys)) == count($searchForKeys); 
}
К-Алекс
источник