ZetCode

PHP array_map 函数

最后修改于 2025 年 3 月 13 日

PHP 的 array_map 函数将一个回调函数应用于一个或多个数组的每个元素。它返回一个包含转换后元素的新数组。

基本定义

array_map 函数通过回调函数处理每个数组元素。它创建一个带有返回的新数组。

语法:array_map(callable $callback, array $array, array ...$arrays): array。回调接收数组元素作为参数并返回转换后的值。

基本的 array_map 示例

此示例演示如何使用 array_map 对数组中的每个数字进行平方。

basic_array_map.php
<?php

declare(strict_types=1);

$numbers = [1, 2, 3, 4, 5];
$squared = array_map(fn($n): int => $n * $n, $numbers);

print_r($squared);
// Output: Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )

回调函数对每个数字进行平方。array_map 返回一个包含平方值的新数组,同时保留原始数组的结构。

处理多个数组

array_map 可以同时处理多个数组。

multiple_arrays.php
<?php

declare(strict_types=1);

$names = ["Alice", "Bob", "Charlie"];
$ages = [25, 30, 35];

$combined = array_map(
    fn($name, $age): string => "$name is $age years old",
    $names,
    $ages
);

print_r($combined);
// Output: Array ( [0] => Alice is 25 years old [1] => Bob is 30 years old... )

这会将两个数组中对应位置的元素组合成字符串。回调函数在相同位置接收每个数组的一个元素。

使用命名函数

对于复杂的逻辑,您可以使用命名函数代替匿名函数。

named_function.php
<?php

declare(strict_types=1);

function formatPrice(float $price): string {
    return '$' . number_format($price, 2);
}

$prices = [19.99, 29.95, 9.50];
$formatted = array_map('formatPrice', $prices);

print_r($formatted);
// Output: Array ( [0] => $19.99 [1] => $29.95 [2] => $9.50 )

formatPrice 函数为每个价格添加美元符号并保留两位小数。函数名以字符串形式传递给 array_map。

处理数组键

array_map 默认不保留键,但我们可以解决这个问题。

preserving_keys.php
<?php

declare(strict_types=1);

$data = ['a' => 1, 'b' => 2, 'c' => 3];
$result = array_map(
    fn($value, $key): array => [$key => $value * 2],
    $data,
    array_keys($data)
);

$final = array_merge(...$result);
print_r($final);
// Output: Array ( [a] => 2 [b] => 4 [c] => 6 )

此示例展示了如何通过将 array_keys 作为第二个数组来保留键。然后合并结果以重新创建原始关联数组结构。

高级:将 array_map 与对象一起使用

array_map 可以转换对象属性或调用方法。

object_transformation.php
<?php

declare(strict_types=1);

class User {
    public function __construct(
        public string $name,
        public string $email
    ) {}
    
    public function getDomain(): string {
        return explode('@', $this->email)[1];
    }
}

$users = [
    new User('Alice', 'alice@example.com'),
    new User('Bob', 'bob@domain.com'),
    new User('Charlie', 'charlie@test.com')
];

$domains = array_map(fn(User $u): string => $u->getDomain(), $users);

print_r($domains);

这会从 User 对象中提取电子邮件域。回调函数在每个对象上调用 getDomain 方法,演示了 array_map 的面向对象用法。

最佳实践

来源

PHP array_map 文档

本教程介绍了 PHP 的 array_map 函数,并通过实际示例展示了其在数组转换场景中的用法。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 PHP 数组函数