我正在嘗試驗證陣列中是否存在某些值,不包括特定鍵:
$haystack = array(
"id" => 1,
"char1" => 2,
"char2" => 3,
"char3" => 4,
);
$needles = array(2, 4);
我在這里找到的解決方案:in_array 多個值
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
1它在鍵中找到了值,id因此當 id 為 1 的 char 不在陣列中時評估為真。我怎樣才能使它排除id搜索中的鍵?
注意:這是示例資料。實際資料要大得多,因此僅使用 if / else 陳述句實際上并不可行。
uj5u.com熱心網友回復:
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"));
這基本上只是回傳沒有您指定的鍵的陣列。這使原始陣列保持完整以供以后使用。
編輯:
這些糟糕的解決方案實際上是資料結構問題的征兆。您應該考慮將陣列轉換為物件。它看起來像這樣:
$object = new stdClass();
$object->id = 1;
$object->chars = array(2, 3, 4);
$exists = in_array_all([1, 3], $object->chars);
這就是你應該如何分離資料的方式。這樣您就可以通過密鑰正確存盤您的資訊。此外,您可以在特定于鍵的物件中存盤其他物件或陣列,如上所示。
uj5u.com熱心網友回復:
取消設定id索引,然后進行搜索:
function in_array_all($needles, $haystack) {
unset($haystack['id']);
return empty(array_diff($needles, $haystack));
}
https://3v4l.org/CDDcf
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/483000.html
