李涛自留地
回到顶部
首页 > php学习 > PHP array_map() 函数详解:对数组元素统一处理

PHP array_map() 函数详解:对数组元素统一处理

文章目录

处理数组时,经常需要对每个元素做统一转换:比如把所有字符串转小写、把所有数字乘以2、或者对每个对象调用某个方法。以前用 foreach 循环处理,后来发现array_map()更简洁高效。

这篇文章把array_map()的用法、多数组处理、结合匿名函数等技巧整理出来。

array_map()基本用法

对数组的每个元素执行回调函数,返回处理后的新数组。

$numbers = [1, 2, 3, 4, 5];

// 每个数字乘以2
$doubled = array_map(function($n) {
    return $n * 2;
}, $numbers);
print_r($doubled);
// [2, 4, 6, 8, 10]
?>

处理字符串

<?php
$emails = [
    'ZhangSan@Example.COM',
    'LiSi@Test.org',
    'WANGWu@Demo.Net',
];

// 统一转小写(邮箱地址规范化)
$normalized = array_map('strtolower', $emails);
print_r($normalized);
/*
[
    0 => zhangsan@example.com,
    1 => lisi@test.org,
    2 => wangwu@demo.net
]
*/

// 注意:直接传函数名 'strtolower' 而不是带括号
// array_map('strtolower', $emails) 等价于
// array_map(function($e) { return strtolower($e); }, $emails)
?>

多数组同时处理

array_map()可以接受多个数组,回调函数相应增加参数:

$first_names = ['张', '李', '王'];
$last_names = ['三', '四', '五'];

// 把两个数组合并为全名
$full_names = array_map(function($first, $last) {
    return $first . $last;
}, $first_names, $last_names);
print_r($full_names);
// ['张三', '李四', '王五']
?>

数组长度不一致时的处理

如果数组长度不同,较短的数组会用 null 填充:

$names = ['张三', '李四'];
$ages = [28, 30, 35];

$result = array_map(function($name, $age) {
    return "$name: $age岁";
}, $names, $ages);
print_r($result);
// [
//     0 => '张三: 28岁',
//     1 => '李四: 30岁',
//     2 => ': 35岁'  // name为null
// ]
?>

实战场景

场景1:批量转换数据库字段类型

<?php
// 从API获取的数据,所有数字都是字符串
$users = [
    ['id' => '1001', 'name' => '张三', 'score' => '95'],
    ['id' => '1002', 'name' => '李四', 'score' => '87'],
    ['id' => '1003', 'name' => '王五', 'score' => '76'],
];

// 批量转换类型
$users = array_map(function($user) {
    $user['id'] = (int)$user['id'];
    $user['score'] = (int)$user['score'];
    return $user;
}, $users);

// 现在可以安全地用于数据库插入或排序
?>

场景2:数组元素转大写/标题格式

<?php
$tags = ['php', 'javascript', 'python', 'css'];

// 转为首字母大写(标签规范化)
$title_tags = array_map('ucfirst', $tags);
print_r($title_tags);
// ['Php', 'Javascript', 'Python', 'Css']

// 转标题格式
$formatted = array_map(function($tag) {
    return ucwords(str_replace('-', ' ', $tag));
}, ['hello-world', 'php-basics', 'css-tricks']);
print_r($formatted);
// ['Hello World', 'Php Basics', 'Css Tricks']
?>

场景3:提取对象数组的某个字段

<?php
class User {
    public function __construct(public string $id, public string $name) {}
}

$users = [
    new User('1', '张三'),
    new User('2', '李四'),
    new User('3', '王五'),
];

// 提取所有用户ID
$ids = array_map(function($user) {
    return $user->id;
}, $users);
print_r($ids);
// ['1', '2', '3']
?>

若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。