Проверка php, содержит ли массив все значения массива из другого массива
$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. Любая идея, пожалуйста?
6 ответов
Посмотрите на array_intersect ().
$containsSearch = count(array_intersect($search_this, $all)) == count($search_this);
Все предыдущие ответы делают больше работы, чем нужно. Просто используйте array_diff. Это самый простой способ сделать это:
$containsAllValues = !array_diff($search_this, $all);
Это все, что вам нужно сделать.
Немного короче с 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
Я думаю, что вы ищете функцию пересечения
array array_intersect ( array $array1 , array $array2 [, array $ ... ] )
array_intersect()
возвращает массив, содержащий все значения array1, которые присутствуют во всех аргументах. Обратите внимание, что ключи сохранены.
Другие ответы работают с данным вариантом использования, однако вы можете получить ложное срабатывание, если проверяете "[]
существует в$all
". Один из способов объяснить этот пограничный случай, используяarray_diff()
примерно так:
function hasAllElems(array $arr1, array $arr2): bool
{
if (empty($arr1) && ! empty($arr2)) {
return false;
}
return ! array_diff($arr1, $arr2);
}
$searchThis = [0 => 200, 1 => 234];
$all = [0 => 307, 1 => 157, 2 => 234, 3 => 200, 4 => 322, 5 => 324];
var_dump(hasAllElems($searchThis, $all)); // true
var_dump(hasAllElems($all, $searchThis)); // false
var_dump(hasAllElems([], $all)); // false
var_dump(hasAllElems($searchThis, [])); // false
Здесь, выполнив явную проверку (т.е. если первый массив пуст и второй массив не пуст), вы можете вернутьfalse
в начале кода.
Вы можете, конечно, также использоватьarray_intersect()
или петля для достижения того же.
Написал сообщение в блоге для тех, кто хочет узнать больше.
Как насчет этого:
function array_keys_exist($searchForKeys = array(), $searchableArray) {
$searchableArrayKeys = array_keys($searchableArray);
return count(array_intersect($searchForKeys, $searchableArrayKeys)) == count($searchForKeys); }