我总是对这些类型的问题感兴趣,它是关于高效代码的(包括代码使用和速度)。也就是说,我尝试了几种不同的方法并对其进行了基准测试,但没有什么比简单的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(两个array_intersect_key):0.33311 sec
$flip = array_flip($fields);
$result = array_replace(
array_intersect_key($flip, $array),
array_intersect_key($array, $flip)
);
ARRAY_WALK(设置为空):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。有时人们认为内置函数更快,但并非总是如此。这些天编译器非常好。