PHP 开发日常,打交道最多的就是数组和字符串。
很多人只会基础 for 循环、foreach 遍历,写出来的代码又长又冗余,看着杂乱还不好维护。
今天整理几个项目里高频用到的数组精简高阶写法,不用造轮子,直接复制就能用到业务代码里。
本文不带废话,实操性强,看懂就能直接用到项目里,建议收藏备用。
一、array_map – 批量处理数组元素
痛点场景
有一个数组 [1,2,3,4],想给每个元素乘以 2。新手往往这样写:
$arr = [1,2,3,4];
$newArr = [];
foreach ($arr as $v) {
$newArr[] = $v * 2;
}
四行代码,看着就啰嗦。
高阶写法
$arr = [1,2,3,4];
$newArr = array_map(function($v){
return $v * 2;
}, $arr);
一行搞定,语义清晰:把数组中每个元素都“映射”一遍。
实战进阶:同时处理多个数组
array_map 还能同时处理多个数组,比如计算两个数组对应位置的和:
$prices = [100, 200, 300];
$counts = [2, 1, 3];
$totals = array_map(function($price, $count){
return $price * $count;
}, $prices, $counts);
// 结果: [200, 200, 900]
💡 使用技巧:如果第二个数组比第一个短,缺失的位置会用 null 补位;处理时注意类型判断。
二、array_filter – 快速过滤空值和无效数据
痛点场景
从表单或数据库拿到的数据经常混着 ''、0、null,需要去掉这些“假值”。
新手代码:
$arr2 = [1, '', 0, null, 5];
$res = [];
foreach ($arr2 as $v) {
if ($v) { // 或者写一堆 isset、empty 判断
$res[] = $v;
}
}
高阶写法
$arr2 = [1, '', 0, null, 5];
$res = array_filter($arr2);
// 结果: [0 => 1, 4 => 5]
默认会过滤掉所有 “等值为 false” 的值,包括 0、""、null、false、[]。注意 0 也会被过滤,如果需要保留数字 0,要加回调:
$arr3 = [0, 1, 2, null, ''];
$res2 = array_filter($arr3, function($v){
return $v !== null && $v !== '';
});
// 结果: [0, 1, 2] 注意 0 被保留了
实战常用:过滤掉空字符串但保留数字 0
$data = ['张三', '', '李四', 0, null];
$clean = array_filter($data, 'strlen'); // strlen 遇到空字符串返回0被过滤,0本身? 注意0也会被过滤,因为strlen(0)=1? 不对,strlen(0)返回1,会保留。更稳妥用自定义回调。
// 推荐写法
$clean = array_filter($data, function($v){
return $v !== '' && $v !== null;
});
三、array_column – 一键提取二维数组的某一列
痛点场景
有一个用户列表,想取出所有人的名字组成新数组。新手往往循环 push:
$list = [
['id'=>1, 'name'=>'张三'],
['id'=>2, 'name'=>'李四']
];
$names = [];
foreach ($list as $user) {
$names[] = $user['name'];
}
高阶写法
$names = array_column($list, 'name');
// 结果: ['张三', '李四']
还可以以某个字段作为索引键:
$listById = array_column($list, null, 'id');
// 结果: [1 => ['id'=>1,'name'=>'张三'], 2 => ['id'=>2,'name'=>'李四']]
array_column($list, 'name', 'id') 则返回 [1 => '张三', 2 => '李四']。
实战进阶:处理对象数组
如果数组元素是对象,同样适用:
$objects = [(object)['id'=>1,'name'=>'张三'], (object)['id'=>2,'name'=>'李四']];
$names = array_column($objects, 'name'); // PHP 7+ 支持
⚠️ 注意:array_column 只能提取二维结构的一列,如果是更深层级,需配合 array_map 或递归。
四、implode / explode – 数组与字符串互转的高效用法
痛点场景
要把 [1,2,3] 变成 "1,2,3",新手写循环拼接字符串,末尾还要处理多余的逗号。
要把 "1,2,3" 拆成数组,可能用 split 或正则,完全没必要。
高阶写法
// 数组 → 字符串
$str = implode(',', [1,2,3]); // "1,2,3"
// 或别名 join(',', [1,2,3])
// 字符串 → 数组
$arr3 = explode(',', $str); // ['1','2','3']
实战高级技巧
① 构建 SQL 的 IN 条件
$ids = [10, 25, 38];
$inStr = implode(',', array_map('intval', $ids)); // 防止注入,转成整数
$sql = "SELECT * FROM users WHERE id IN ($inStr)";
② 把查询参数拼成 HTTP 查询字符串
$params = ['name' => '张三', 'age' => 20];
$query = http_build_query($params); // 自带编码,但 implode 也能配合
// 或者手动:
$queryStr = implode('&', array_map(function($k, $v){
return"$k=$v";
}, array_keys($params), $params));
③ 按多字符分割 – 用 preg_split
explode 只能按一个字符分割。需要按 ", "(逗号+空格)或正则分割时:
$str = "苹果, 香蕉, 橙子";
$arr = preg_split('/,\s*/', $str); // ['苹果','香蕉','橙子']
④ 限制分割次数
$str = "a,b,c,d";
$parts = explode(',', $str, 2); // ['a', 'b,c,d']
总结
| | |
|---|
array_map | | foreach |
array_filter | | foreach |
array_column | | foreach |
implode/explode | | |
用好这四个函数,你的代码行数至少减少三分之一,可读性大幅提升。再也不用写十几行的 foreach 做简单数据转换了。
以上就是本次分享的 PHP 数组高阶写法,内容都是工作实战总结,觉得有用可以点赞、收藏,方便后续随时回看。
专注分享 PHP、ThinkPHP、MySQL 实战开发干货,只讲工作能用得上的技巧,不堆砌理论、不写废话。
建议收藏本号,后续持续更新避坑教程、实战源码和面试知识点,有问题欢迎评论区留言交流。