数组中的多个值不包括指定的键
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);
}
我正在尝试验证数组中是否存在特定值(不包括特定键):
$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);
}