0

0

PHP数组去空值效率测试_哪种方法最快说明【说明】

看不見的法師

看不見的法師

发布时间:2026-02-11 09:31:46

|

354人浏览过

|

来源于php中文网

原创

array_filter() 默认去所有 falsy 值(null、false、0、0.0、''、[]),非仅“去空”;会重排键名,且 0 也被删除,语义为“去假值”而非“去空”。

php数组去空值效率测试_哪种方法最快说明【说明】

array_filter() 默认行为为什么能去空值

array_filter() 不传回调函数时,会用 PHP 内部的“truthy/falsy 判断逻辑”过滤掉所有 falsy 值:包括 nullfalse00.0、空字符串 ''、空数组 []。这不是“去空”,而是“去假值”——这点常被误读为“去空字符串”或“去 null”,实际它连 0 都会删掉。

常见错误现象:
原数组有 [1, 0, 'hello', ''],用 array_filter($arr) 后变成 [1 => 1, 2 => 'hello']0 消失了,且键名重排(非连续索引)。

  • 若你只要剔除 null'',但保留 0false,就不能直接用默认 array_filter()
  • 默认调用是 C 层实现,无 PHP 回调开销,速度最快 —— 但语义不精确
  • PHP 8.0+ 中,array_filter($arr, fn($v) => $v !== '' && $v !== null) 这类匿名函数写法比传统 function(){} 快约 15%,但仍慢于无回调版本

foreach 手动遍历在什么场景下反而更稳

当你要精准控制“空”的定义(比如只删 null,保留 '';或删 ''null,但留 0),foreach 是最透明、最可控的方式。

实操建议:
用引用赋值 + unset() 可避免重建数组,节省内存;但注意键名不会自动重排:

立即学习PHP免费学习笔记(深入)”;

创客贴设计
创客贴设计

创客贴设计,一款智能在线设计工具,设计不求人,AI助你零基础完成专业设计!

下载
foreach ($arr as $k => &$v) {
    if ($v === null || $v === '') {
        unset($arr[$k]);
    }
}
  • 不推荐 $new[] = $v 方式重建,小数组无感,大数组(>10 万元素)会多一次内存分配
  • PHP 7.4+ 支持箭头函数,但无法用于带 unset 的复杂逻辑,此时还是传统 foreach 更直接
  • 如果后续要 array_values() 重排索引,记得单独加——这一步是 O(n) 开销,别漏掉

array_diff() 和 array_filter() 性能差多少

array_diff($arr, [null, '']) 看似简洁,但它是为“比较多个数组差异”设计的,底层会做哈希键映射和全量扫描,对单数组去空属于杀鸡用牛刀。

基准测试(10 万元素纯数值+字符串混合数组,PHP 8.2):
array_filter($arr):≈ 1.8 ms
array_filter($arr, fn($v) => $v !== null && $v !== ''):≈ 4.2 ms
array_diff($arr, [null, '']):≈ 9.7 ms
– 手动 foreach + unset:≈ 2.1 ms

  • array_diff() 在内部会把第二个参数转为键值对并去重,哪怕你只传两个值,它也走完整 diff 流程
  • 如果数组含非标量值(如对象、资源),array_diff() 直接报 Warning: Array to string conversion
  • 不要为了“看起来函数式”而选 array_diff() —— 语义错、性能差、容错弱

PHP 8.3 的 array_filter() 新特性值得升级吗

PHP 8.3 引入了 ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH 标志,但它们解决的是“按键过滤”或“键值联合判断”问题,**并不加速纯值过滤**,也不改变默认去 falsy 的行为。

也就是说:如果你的需求仍是“去掉空字符串和 null”,PHP 8.3 并没给你更快的原生方案。真正提速的点在于 JIT 编译优化和引擎底层改进,而非这个函数本身。

  • 升级到 8.3 后,array_filter($arr, ...) 的回调执行确实略快(约 3~5%),但前提是用了 JIT 且代码热路径足够长
  • 若你用的是 OpCache + 静态编译,PHP 8.1 和 8.3 在该操作上差距可忽略
  • 别为单个函数升级 PHP 大版本——先确认你的“空”到底指什么,再选方法,比版本更重要
实际项目里,最易被忽略的是“空”的定义是否统一贯穿前后端。比如前端传 '',后端却用 array_filter()0 也干掉了,结果数字字段莫名消失——这种问题不会出现在 benchmark 里,但天天发生在联调现场。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

688

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

243

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

664

2024.03.01

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

162

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

485

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1544

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

637

2023.11.24

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

50

2026.02.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 11.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号