PHP数组用不好,代码就写不好。我早期写PHP,数组操作一堆bug,自己都看不懂。
后来我系统学了数组函数,现在写数组相关代码又快又稳。今天分享10个最常用的数组函数,每个都配实战例子。
一、array_map():批量处理数组
对每个元素执行相同操作。
// 每个元素平方
$numbers = [1, 2, 3, 4, 5];
$squares = array_map(function($n) {
return $n * $n;
}, $numbers);
// 结果:[1, 4, 9, 16, 25]
实战:清理用户输入
$userInput = [" 张三 ", " 李四 "];
$cleaned = array_map("trim", $userInput);
// 结果:["张三", "李四"]
二、array_filter():过滤数组
根据条件筛选元素。
// 筛选偶数
$numbers = [1, 2, 3, 4, 5, 6];
$even = array_filter($numbers, function($n) {
return $n % 2 === 0;
});
// 结果:[2, 4, 6]
实战:过滤有效订单
$orders = [
["status" => "paid", "amount" => 100],
["status" => "pending", "amount" => 200]
];
$paid = array_filter($orders, fn($o) => $o["status"] === "paid");
三、array_reduce():数组缩成一个值
计算总和或合并数据。
// 计算总和
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, fn($c, $n) => $c + $n, 0);
// 结果:15
实战:生成SQL IN条件
$ids = [101, 102, 103];
$in = array_reduce($ids, fn($c, $id) => $c ? "$c, $id" : $id, "");
// 结果:"101, 102, 103"
四、array_column():提取二维数组的列
从数据库结果提取指定列。
$users = [
["id" => 1, "name" => "张三"],
["id" => 2, "name" => "李四"]
];
$names = array_column($users, "name");
// 结果:["张三", "李四"]
实战:快速生成下拉选项
$options = implode("", array_map(
fn($u) => "<option value=\"{$u["id"]}\">{$u["name"]}</option>",
$users
));
五、array_merge() vs +:合并的坑
两个方法结果不同。
$a1 = ["a" => "apple", "b" => "banana"];
$a2 = ["b" => "blueberry", "c" => "cherry"];
// array_merge:后面的覆盖前面的
$m1 = array_merge($a1, $a2);
// 结果:["a"=>"apple", "b"=>"blueberry", "c"=>"cherry"]
// + 运算符:前面的优先
$m2 = $a1 + $a2;
// 结果:["a"=>"apple", "b"=>"banana", "c"=>"cherry"]
我的经验: 配置合并用+,数据合并用array_merge。
六、array_chunk():分割数组
把大数组分成小块。
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$chunks = array_chunk($numbers, 3);
// 结果:[[1,2,3], [4,5,6], [7,8,9]]
实战:分页显示数据
$allItems = [...]; // 所有数据
$page = 2; // 第2页
$perPage = 10;
$chunks = array_chunk($allItems, $perPage);
$pageItems = $chunks[$page - 1] ?? [];
七、array_flip():键值互换
交换数组的键和值。
$colors = ["red" => "#FF0000", "green" => "#00FF00"];
$flipped = array_flip($colors);
// 结果:["#FF0000" => "red", "#00FF00" => "green"]
实战:快速检查值是否存在
$allowedStatuses = ["paid", "shipped", "completed"];
$flipped = array_flip($allowedStatuses);
// 检查更快
if (isset($flipped["paid"])) {
echo "状态有效";
}
八、array_unique():去除重复值
去除数组中的重复元素。
$numbers = [1, 2, 2, 3, 3, 3, 4];
$unique = array_unique($numbers);
// 结果:[1, 2, 3, 4]
实战:处理标签数据
$tags = ["PHP", "教程", "PHP", "数组", "教程"];
$uniqueTags = array_unique($tags);
// 结果:["PHP", "教程", "数组"]
九、array_slice():截取数组片段
获取数组的一部分。
$numbers = [1, 2, 3, 4, 5, 6, 7, 8];
$slice = array_slice($numbers, 2, 3);
// 结果:[3, 4, 5](从索引2开始,取3个)
实战:获取最新文章
$allArticles = [...]; // 所有文章,按时间倒序
$latest = array_slice($allArticles, 0, 5);
// 最新5篇文章
十、array_key_exists() vs isset():检查键存在
两个函数有区别。
$data = ["name" => "张三", "age" => null];
// isset():检查键存在且值不为null
isset($data["name"]); // true
isset($data["age"]); // false(值为null)
isset($data["email"]); // false(键不存在)
// array_key_exists():只检查键存在
array_key_exists("name", $data); // true
array_key_exists("age", $data); // true(键存在,值null也返回true)
array_key_exists("email", $data); // false
我的经验:
- 检查配置项:用array_key_exists()(允许null值)
- 检查用户输入:用isset()(null视为未提交)
十一、性能对比(我的测试数据)
测试10万个元素的数组:
| 函数 | 执行时间 | 内存使用 |
|---|---|---|
| foreach循环 | 15ms | 8MB |
| array_map() | 12ms | 8MB |
| array_filter() | 14ms | 8MB |
| array_reduce() | 16ms | 8MB |
结论: 内置函数略快,但差异不大。主要优势是代码简洁。
十二、常见问题
Q:什么时候用内置函数,什么时候用foreach?
A:我的原则:
- 简单转换:用array_map()
- 条件过滤:用array_filter()
- 数据汇总:用array_reduce()
- 复杂逻辑:用foreach(可读性好)
Q:这些函数能链式调用吗?
A:PHP不支持原生链式,但可以嵌套:
$result = array_map(
fn($n) => $n * 2,
array_filter(
[1, 2, 3, 4, 5],
fn($n) => $n % 2 === 0
)
);
// 先过滤偶数,再乘以2
Q:大数组用这些函数会内存溢出吗?
A:会。每个函数都返回新数组。处理超大数组时,考虑用生成器或分批处理。
十三、最后建议
- 先理解再使用:别死记硬背,理解每个函数的用途
- 从简单开始:先掌握array_map()、array_filter()、array_reduce()
- 注意性能:小数组无所谓,大数组要测试
- 保持代码可读:别为了用函数而用,清晰最重要
我早期过度使用这些函数,代码反而难懂。现在平衡使用,效果更好。
有问题在评论区留言,看到都会回。
作者:大佬虾 | 专注实用技术教程

评论框