首选 array_intersect(),它按值匹配并保持原顺序和键名,但需用 array_values() 重置索引;若需严格类型比较或灵活条件,则用 array_filter() 配 in_array($v, $allowed, true) 或 isset($flipped[$v]) 提速。

直接用 array_intersect() 最省事,但得注意它只比对值、不认键,且返回结果键名是原数组的——如果后续要数字索引,必须补 array_values()。
用 array_intersect() 批量保留指定值
这是最贴近“只保留指定几个值”语义的做法:传入原数组和一个包含目标值的数组,函数自动找出所有匹配项(包括重复值),并保持它们在原数组中的顺序和原始键名。
- 如果原数组有重复值(比如
['a', 'b', 'a']),而你要保留['a'],结果会是[0 => 'a', 2 => 'a'],不是只留一个'a' - 值类型必须严格一致:
array_intersect([1, '1'], [1])返回[0 => 1],不会把字符串'1'当成相同值 - 不支持按键筛选,只看值;如果原数组是关联数组但你想按键保留,这不是正确工具
用 array_filter() + 匿名函数做条件判断
当你需要更灵活的逻辑(比如“保留大于 10 的数字”或“保留非空字符串”),或者想避免 array_intersect() 对重复值的保留行为时,array_filter() 更可控。
- 回调函数里用
in_array($v, $allowed, true)模拟白名单效果,记得加第三个参数true启用严格比较 -
array_filter()默认保留原始键名,如果之后要for循环或array_shift(),必须套一层array_values() - 性能上,对大数组反复调用
in_array()可能略慢;可提前用array_flip($allowed)转成键查找,再用isset($flipped[$v])提速
别误用 array_slice() 或 array_splice()
这两个函数操作的是“位置”,不是“值”。如果你说的“指定几个值”是指 ['apple', 'banana'] 这些字面值,而不是“前两个元素”,那它们完全不适用。
-
array_slice($arr, 0, 2)拿的是索引 0 和 1 的元素,不管它们是不是'apple' -
array_splice()会直接改原数组,且同样只认下标,不认内容 - 强行混用(比如先
array_search()找位置再array_slice())代码冗长、易出错,还处理不了重复值
真正容易被忽略的是键名残留问题:无论用 array_intersect() 还是 array_filter(),返回的数组都大概率带非连续数字键或字符串键。除非你明确需要保留原始键映射,否则几乎每次都要接一个 array_values(),否则后续用 foreach 看似安全,但用 for ($i = 0; $i 就会跳过缺失索引的位置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











