当前位置:首页>php>用好 PHP 这几个数组函数,代码精简一半

用好 PHP 这几个数组函数,代码精简一半

  • 2026-10-11 11:59:29
用好 PHP 这几个数组函数,代码精简一半

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
 + if 判断
array_column
提取二维数组的一列
foreach
 + 收集字段
implode/explode
数组↔字符串互转
手写拼接 + 正则分割

用好这四个函数,你的代码行数至少减少三分之一,可读性大幅提升。再也不用写十几行的 foreach 做简单数据转换了。


以上就是本次分享的 PHP 数组高阶写法,内容都是工作实战总结,觉得有用可以点赞、收藏,方便后续随时回看。

专注分享 PHP、ThinkPHP、MySQL 实战开发干货,只讲工作能用得上的技巧,不堆砌理论、不写废话。

建议收藏本号,后续持续更新避坑教程、实战源码和面试知识点,有问题欢迎评论区留言交流。

最新文章

随机文章