最直接方式是用array_filter配合匿名函数判断值的奇偶性而非索引;需注意键保留原样、非整数转换规则及按键筛选时须传ARRAY_FILTER_USE_BOTH参数。
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
[10 => 'x', 20 => 'y'])也生效,结果取决于键值本身,而非顺序小数组无所谓,但处理几千以上元素时,array_filter 的函数调用开销略高于手动 foreach。PHP 7.4+ 支持箭头函数可稍简写,但逻辑不变。
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 更快,但无法保留原始键,且不适用于关联数组真正要区分清楚的,是“值奇偶”还是“位置奇偶”——这个判断一旦错了,后面所有逻辑都偏了。