鑑於像數組:性能:搜索值,並返回子陣列鍵
$nouns = array(
"man" => array("men"),
"octopus" => array("octopi", "octopuses"),
"ox" => array("oxen")
);
由大約3000單數 - 多對,怎麼會一送單數(密鑰)的最有效,通過呼叫,例如array_search_loosely($nouns, "men")
?
然後我期望收到一個值爲「man」的數組。
我已經嘗試了四種不同的方法:
原始(使用功能array_is_assoc
,這是相當不言自明的和無關的情況)
function array_search_loosely($array, $values, $compare_keys = false) {
$values = is_array($values) ? $values : array($values);
foreach($array as $item_key => $item) {
if (is_array($item)) {
$return_key = true;
foreach($values as $value_key => $value) {
if (!in_array($value, $item)) {
$return_key = false;
break;
}
elseif($compare_keys === true and array_is_assoc($values)) {
if (!in_array($value_key, array_keys($item, $value))) {
$return_key = false;
break;
}
}
}
if ($return_key === true) {
$item_keys[] = $item_key;
}
}
elseif(!is_array($values)) {
if ($item === $values) {
$item_keys[] = $item_key;
}
}
}
return (isset($item_keys))? $item_keys : false;
}
第二條本辦法:
function array_search_loosely($array, $values, $compare_keys = false) {
$keys = array_keys(array_filter($array, function($item) use ($values, $compare_keys) {
return (!is_array($item) and $item === $values) or (is_array($item) and each_in_array($item, array_create($values), $compare_keys));
}));
return !empty($keys) ? $keys : false;
}
function each_in_array($array, $values, $compare_keys = false) {
return $compare_keys === false ? count(array_uintersect($values, $array, function($item1, $item2) { return $item1 === $item2 ? 0 : ($item1 > $item2 ? 1 : -1); })) == count($values) : count(array_uintersect_assoc($values, $array, function($item1, $item2) { return $item1 === $item2 ? 0 : ($item1 > $item2 ? 1 : -1); })) == count($values);
}
我選擇使用array_uintersect
,也允許數組爲$items
,因爲如果我要使用array_intersect,則會爲每個數組$item
生成通知。這個選擇允許each_in_array()
也檢查數組$values
。
此外,第三個可選參數$compare_keys
與此情況無關,但在其他情況下使用該功能。
第三種和第四種方法是前述的混合物。在這一點上,我的原始方法仍然是最快的,但是當我用幾百或幾千個字運行我的功能時,操作仍將花費幾十秒。關於如何提高在這種情況下獲得複數奇異性的任何建議?
「然後,我期望得到與值數組的‘人’。」 - 這是至關重要的嗎?會不會有一個字符串更有用? – verbumSapienti
有時兩個單數字具有相同的複數,這意味着應該返回多個鍵。 (data,datum => data)另外,這在函數的其他應用程序中尤爲重要。 – user2180613