数组中的多个值不包括指定的键

Multiple values in array excluding specified key

我正在尝试验证数组中是否存在特定值(不包括特定键):

$haystack = array(
    "id" => 1,
    "char1" => 2,
    "char2" => 3,
    "char3" => 4,
);

$needles = array(2, 4);

我在这里找到的解决方案:in_array multiple values

function in_array_all($needles, $haystack) {
    return empty(array_diff($needles, $haystack));
}

问题是我正在检查数组中是否存在某些字符。这在这种情况下会很好用:

$exists = in_array_all([2, 4], $haystack); // true

但在这种情况下会引起问题:

$exists = in_array_all([1, 3], $haystack); // true

它在键 id 中找到了值 1,因此当 id 为 1 的字符不在数组中时计算结果为真。我怎样才能让它在搜索中排除键 id

注意:这是示例数据。实际数据要大得多,所以仅使用 if / else 语句并不可行。

function in_array_all($needles, $haystack) {
    return empty(array_diff($needles, $haystack));
}

function excludeKeys($haystack){
    $tempArray = array();
    foreach($haystack as $key => $value){
        if ($key == "id"){
            // Don't include
        }else{
            $tempArray[$key] = $value;
        }
    }
    return $tempArray;
}

$haystack = array(
    "id" => 1,
    "char1" => 2,
    "char2" => 3,
    "char3" => 4,
);

$exists = in_array_all([1, 3], excludeKeys($haystack));

echo("Exists: ".($exists ? "Yes" : "No"));

这基本上只是 returns 没有指定键的数组。这样可以保留原始数组以备后用。

编辑:

这些糟糕的解决方案实际上是您的数据结构存在问题的征兆。您应该考虑将数组转换为对象。它看起来像这样:

$object = new stdClass();
$object->id = 1;
$object->chars = array(2, 3, 4);

$exists = in_array_all([1, 3], $object->chars);

这就是您应该如何分离数据。这样您就可以通过密钥正确存储您的信息。此外,您可以在特定于键的对象中存储其他对象或数组,如上所示。

取消设置 id 索引然后进行搜索:

function in_array_any($needles, $haystack) {
    unset($haystack['id']);
    return !array_diff($needles, $haystack);
}

https://3v4l.org/PTjOS