php数组如何筛选奇数或偶数项_php数组奇偶筛选实现【技巧】

7次阅读

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

php数组如何筛选奇数或偶数项_php数组奇偶筛选实现【技巧】

用 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 里,需提前定义函数名
  • 避免在回调里做耗时操作(如数据库查询、文件读取),否则性能急剧下降
  • 若原数组有 NULLfalse0 等 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 更快,但无法保留原始键,且不适用于关联数组

真正要区分清楚的,是“值奇偶”还是“位置奇偶”——这个判断一旦错了,后面所有逻辑都偏了。

text=ZqhQzanResources