PHP:检查一个数组是否包含另一个数组的所有值

qcuzuvrc  于 2023-02-28  发布在  PHP
关注(0)|答案(6)|浏览(270)
$all = array
(
    0 => 307,
    1 => 157,
    2 => 234,
    3 => 200,
    4 => 322,
    5 => 324
);
$search_this = array
(
    0 => 200,
    1 => 234
);

我想知道$all是否包含所有的$search_this值并返回truefalse

x9ybnkn6

x9ybnkn61#

前面的答案都做了比实际需要更多的工作。只要使用array_diff。这是最简单的方法:

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

这就是你要做的。

inkz8wg9

inkz8wg92#

看看array_intersect()

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

对于关联数组,请查看array_intersect_assoc()
或者,对于子数组的递归比较,请尝试:

<?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;
    }
}
cpjpxq1n

cpjpxq1n3#

使用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
fd3cxomn

fd3cxomn4#

我想你是在找一个

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

array_intersect()返回一个数组,其中包含array1的所有参数中存在的所有值。请注意,键是保留的。
http://www.php.net/manual/en/function.array-intersect.php

kr98yfug

kr98yfug5#

不如这样:

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

    return count(array_intersect($searchForKeys, $searchableArrayKeys)) == count($searchForKeys); 
}
siv3szwd

siv3szwd6#

其他答案适用于给定的用例,但是,如果您检查“[] exists in $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()或循环来实现相同的目的。
为那些有兴趣了解更多信息的人编写了一个blog post

相关问题