核心PHP中是否有原生函数可通过指定键名从数组提取特定键值对?
核心PHP实现数组提取指定键值对的方案
嘿,这个需求在核心PHP里完全能搞定,而且有不止一种原生方案,我给你详细说说:
1. 最直接的原生函数:array_intersect_key()
这是PHP专门用来处理数组键交集的函数,完美匹配你的需求。它会对比两个数组的键,返回第一个数组中那些键在第二个数组里存在的键值对。
用法示例:
$my_array = ['foo1' => 'bar1', 'foo2' => 'bar2', 'foo3' => 'bar3']; $keys_to_keep = ['foo1', 'foo3']; // 先把要保留的键转成「键为目标键名」的数组(值无关紧要) $key_map = array_flip($keys_to_keep); $result = array_intersect_key($my_array, $key_map); print_r($result); // 输出结果:Array ( [foo1] => bar1 [foo3] => bar3 )
这里array_flip()的作用是把['foo1','foo3']转换成['foo1' => 0, 'foo3' => 1],这样array_intersect_key()就能精准匹配原数组的键了。
2. 封装成Laravel风格的array_only()函数
如果觉得上面的步骤有点绕,你可以自己封装一个和Laravel $request->only()用法一致的函数,用起来更顺手:
function array_only(array $array, array|string $keys): array { // 兼容传入单个键的情况 if (!is_array($keys)) { $keys = [$keys]; } $filtered = []; foreach ($keys as $key) { // 检查键是否存在,避免Notice提示 if (array_key_exists($key, $array)) { $filtered[$key] = $array[$key]; } } return $filtered; } // 调用方式和Laravel几乎一样 $my_array = ['foo1' => 'bar1', 'foo2' => 'bar2', 'foo3' => 'bar3']; $result = array_only($my_array, ['foo1', 'foo3']); // 也支持单个键:array_only($my_array, 'foo1'); print_r($result);
这个函数还做了兼容性处理,不管你传单个键还是键数组都能正常工作,非常实用。
3. PHP 7.4+ 简洁写法:箭头函数 + array_filter()
如果你用的是PHP 7.4及以上版本,还可以用箭头函数结合array_filter()的特殊参数来实现,代码更简洁:
$my_array = ['foo1' => 'bar1', 'foo2' => 'bar2', 'foo3' => 'bar3']; $keys_to_keep = ['foo1', 'foo3']; $result = array_filter( $my_array, fn($key) => in_array($key, $keys_to_keep), ARRAY_FILTER_USE_KEY ); print_r($result);
这里ARRAY_FILTER_USE_KEY让array_filter()的回调函数接收数组的键名而非值,省去了手动遍历的麻烦。
总结
- 追求性能和原生支持:优先用
array_intersect_key(),这是PHP原生实现的,效率最高; - 追求API友好性:自己封装
array_only()函数,和你熟悉的Laravel用法保持一致; - 追求简洁代码(PHP 7.4+):用箭头函数版的
array_filter()。
内容的提问来源于stack exchange,提问作者habib
相关产品推荐
相关产品推荐

