私は常に、効率的なコード(コードの使用と速度の両方) に関するこの種の質問に興味があります。とはいえ、いくつかの異なる方法を試してベンチマークしましたが、これほど効率的でシンプルなものはありませんでしたforeach
。
投稿されたすべてのソリューションと、独自のarray_walkと基本的なforeachを試しました。Miraage によって投稿された配列とフィールドの両方を使用して、いくつかのテストをいくつか実行しました。また、$fields に $array にない値が含まれている場合に値が追加されるなど、結果に奇妙な点があることにも気付きました。
速攻で注文しました。
FOREACH: 0.01245 秒
$result = array();
foreach ($fields as $k)
{
if (isset($array[$k]))
$result[$k] = $array[$k];
}
ARRAY_DIFF_KEY: 0.01471 秒(予期しない結果: 追加の値)
$result = array_diff_key($fields, $array);
FOREACH (関数): 0.02449 秒
function array_filter_by_key($array, $fields)
{
$result = array();
foreach ($fields as $k)
{
if (isset($array[$k]))
$result[$k] = $array[$k];
}
return $result;
}
ARRAY_WALK (参照による): 0.09123 秒
function array_walk_filter_by_key($item, $key, $vars)
{
if (isset($vars[1][$item]))
$vars[0][$item] = $vars[1][$item];
}
$result = array();
array_walk($fields, 'array_walk_filter_by_key', array(&$result, &$array));
リスト/各: 0.12456 秒
$result = array();
reset($fields);
while (list($key, $value) = each($fields))
{
if (isset($array[$value]))
$result[$value] = $array[$value];
}
ARRAY_INTERSECT_KEY: 0.27264 秒(順序が正しくありません)
$result = array_intersect_key($array, array_flip($fields));
ARRAY_REPLACE (array_intersect_key 秒): 0.29409 秒(予期しない結果: 追加の値)
$result = array_replace(
array_fill_keys($fields, false),
array_intersect_key($array, array_flip($fields))
);
ARRAY_REPLACE (2 つの array_intersect_key): 0.33311 秒
$flip = array_flip($fields);
$result = array_replace(
array_intersect_key($flip, $array),
array_intersect_key($array, $flip)
);
ARRAY_WALK (null を設定): 3.35929 秒(予期しない結果: 追加の値)
function array_walk_filter_by_key_null(&$item, $key, $array)
{
if (isset($array[$key]))
$item = $array[$key];
else
$item = null;
}
$result = array_flip($fields);
array_walk($result, 'array_walk_filter_by_key_null', $array);
ARRAY_REPLACE (array_intersect_key が最初): 11.11044 秒
$flip = array_flip($fields);
$result = array_intersect_key(
array_replace($flip, $array),
array_intersect_key($flip, $array)
);
ARRAY_MERGE: 14.11296 秒(予期しない結果: 追加の値)
$result = array_splice(
array_merge(array_flip($fields), $array),
0,
count($fields)
);
それで、それはあります。DIYには勝てません。組み込み関数の方が高速であるという認識がある場合もありますが、常にそうであるとは限りません。最近のコンパイラはかなり優れています。