次のような配列が与えられた場合:
$nouns = array(
"man" => array("men"),
"octopus" => array("octopi", "octopuses"),
"ox" => array("oxen")
);
約 3000 の単数形と複数形のペアで構成されていますが、単数形 (キー) を最も効率的に取得するには、たとえばarray_search_loosely($nouns, "men")
?
次に、値が「man」の配列を受け取ることを期待しています。
私は4つの異なるアプローチを試しました:
オリジナル(関数 を使用します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;
}
2番目のアプローチ:
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_intersectを使用すると、 array ごとに通知が生成されるため、 を使用して arrayarray_uintersect
も使用できるようにしました。この選択により、配列もチェックできます。$items
$item
each_in_array()
$values
また、3 番目の省略可能なパラメーター$compare_keys
は、この状況には関係ありませんが、この関数を使用する他の状況では関係があります。
3 番目と 4 番目のアプローチは、前述のアプローチを組み合わせたものです。この時点では、元のアプローチが依然として最速ですが、数百または数千の単語で関数を実行すると、操作に数十秒かかります。この状況で単数形の複数形を取得するパフォーマンスを向上させる方法について何か提案はありますか?