最直接方式是用array_filter配合匿名函数判断值的奇偶性而非索引;需注意键保留原样、非整数转换规则及按键筛选时须传ARRAY_FILTER_USE_BOTH参数。

用 array_filter 筛选奇数或偶数元素
PHP 中最直接的方式是配合 array_filter 和匿名函数判断余数。关键不是“索引奇偶”,而是“值本身奇偶”——这点常被误读,需先确认需求。
示例:筛选出数组中所有偶数值
$arr = [1, 2, 3, 4, 5, 6];
$evens = array_filter($arr, function($v) {
return $v % 2 === 0;
});
// $evens 是 [2 => 2, 3 => 4, 5 => 6],键保留原样
- 用
$v % 2 === 0判偶数,$v % 2 !== 0判奇数 - 注意返回的是关联数组,键不会重排;如需数字索引,后续加
array_values() - 若原始数组含非整数(如字符串
"3"),%运算会强制转为整数,但"abc"会转成0,可能误判
按数组键(索引)筛选奇数位或偶数位
如果实际想取“第 0、2、4… 项”(即键为偶数的元素),就不能用值判断,得在回调里检查键 $k。
$arr = ['a', 'b', 'c', 'd', 'e'];
$evenKeys = array_filter($arr, function($v, $k) {
return $k % 2 === 0;
}, ARRAY_FILTER_USE_BOTH);
// $evenKeys 是 [0 => 'a', 2 => 'c', 4 => 'e']
- 必须传入第三个参数
ARRAY_FILTER_USE_BOTH,否则闭包只接收值$v - 索引从 0 开始,所以“偶数键”对应第 1、3、5… 个位置(人类计数习惯易混淆)
- 对非连续键(如
[10 => 'x', 20 => 'y'])也生效,结果取决于键值本身,而非顺序
性能与兼容性注意点
小数组无所谓,但处理几千以上元素时,array_filter 的函数调用开销略高于手动 foreach。PHP 7.4+ 支持箭头函数可稍简写,但逻辑不变。
立即学习“PHP免费学习笔记(深入)”;
- PHP array_filter 里,需提前定义函数名
- 避免在回调里做耗时操作(如数据库查询、文件读取),否则性能急剧下降
- 若原数组有
null、false、0等 falsy 值,且未用严格比较(===),$v % 2可能返回0被误过滤
常见错误现象和绕过方法
典型报错:Warning: array_filter() expects exactly 2 parameters——漏传回调,或 PHP 版本太低不支持三参数模式。
- 想筛“索引为偶数的元素”却写了
function($v) { return $v % 2 === 0; }:这是筛值为偶数,不是筛位置 - 用了
ARRAY_FILTER_USE_BOTH却没在函数签名里声明$k参数:PHP 会警告参数数量不匹配 - 用
for循环手动遍历时,$i += 2更快,但无法保留原始键,且不适用于关联数组
真正要区分清楚的,是“值奇偶”还是“位置奇偶”——这个判断一旦错了,后面所有逻辑都偏了。











