在PHP开发过程中,数组重构和数据结构转换是高频操作,比如把索引数组转成键值对数组、给数组元素统一添加字段、提取数组中的特定字段组成新数组等。如果每次都用foreach循环处理,不仅代码篇幅长,还容易出现重复逻辑。array_map函数可以帮我们更优雅地完成这类操作,减少冗余代码。

array_map函数基本说明
array_map是PHP内置的数组处理函数,作用是把回调函数作用到给定数组的每一个元素上,返回处理后的新数组。它的基本语法如下:
<?php
/**
* @param callable $callback 回调函数,接收数组元素作为参数,返回处理后的值
* @param array $array 待处理的数组
* @return array 处理后的新数组
*/
function array_map(callable $callback, array $array): array
{
// 函数内部实现逻辑由PHP引擎提供,无需开发者编写
}
?>需要注意的是,array_map不会改变原数组,而是返回一个新的数组,原数组的结构和数据不会被修改。
常见数组重构场景示例
场景一:给数组元素统一添加字段
假设我们有一个用户列表数组,每个元素只有id和name字段,现在需要给每个用户添加age字段,默认值为18,用array_map可以一行代码完成:
<?php
$users = [
['id' => 1, 'name' => '张三'],
['id' => 2, 'name' => '李四'],
['id' => 3, 'name' => '王五']
];
// 使用array_map给每个用户添加age字段
$newUsers = array_map(function ($user) {
$user['age'] = 18;
return $user;
}, $users);
print_r($newUsers);
?>场景二:提取数组特定字段组成新数组
如果只需要从用户数组中提取所有的name字段组成新数组,也可以用array_map快速实现:
<?php
$users = [
['id' => 1, 'name' => '张三', 'age' => 18],
['id' => 2, 'name' => '李四', 'age' => 20],
['id' => 3, 'name' => '王五', 'age' => 22]
];
// 提取所有name字段
$names = array_map(function ($user) {
return $user['name'];
}, $users);
print_r($names);
?>场景三:处理多个数组的对应元素
array_map还支持传入多个数组,回调函数会依次接收每个数组的对应位置元素作为参数,适合多个数组对应元素合并的场景:
<?php
$ids = [1, 2, 3];
$names = ['张三', '李四', '王五'];
$ages = [18, 20, 22];
// 合并三个数组的对应元素为关联数组
$userList = array_map(function ($id, $name, $age) {
return [
'id' => $id,
'name' => $name,
'age' => $age
];
}, $ids, $names, $ages);
print_r($userList);
?>array_map与foreach的效率对比
很多开发者会关心array_map和foreach的效率差异,我们可以做一个简单的测试,处理10万个元素的数组,对比两种方式的执行时间:
<?php
$testArray = range(1, 100000);
// 测试foreach方式
$start = microtime(true);
$foreachResult = [];
foreach ($testArray as $item) {
$foreachResult[] = $item * 2;
}
$foreachTime = microtime(true) - $start;
// 测试array_map方式
$start = microtime(true);
$mapResult = array_map(function ($item) {
return $item * 2;
}, $testArray);
$mapTime = microtime(true) - $start;
echo "foreach执行时间:{$foreachTime}秒\n";
echo "array_map执行时间:{$mapTime}秒\n";
?>实际测试结果显示,在数据量较小的时候两者效率差异可以忽略,数据量较大时foreach会略快一点,但array_map的代码简洁度优势更明显,除非是性能要求极高的场景,否则优先选择array_map可以让代码更易维护。
使用注意事项
- 回调函数如果只做简单的逻辑处理,可以用箭头函数简化写法,比如
array_map(fn($item) => $item * 2, $array),代码更简洁。 - 传入的数组如果是空数组,array_map会返回空数组,不会报错,使用时不需要额外做空数组判断。
- 如果多个数组长度不一致,array_map会以最短的数组长度为准,不足的元素会传入null给回调函数,需要注意处理这种情况。
array_map的核心优势是代码可读性和简洁性,适合处理不需要复杂逻辑判断的批量数组转换场景,合理使用可以大幅提升PHP数组重构的效率。
通过上面的示例可以看出,在PHP数组重构和数据结构转换的场景中,array_map是一个非常实用的工具,只要掌握它的用法和适用场景,就能写出更优雅高效的代码。