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 的面向对象用法。
最佳实践
- 类型安全:在回调中使用类型提示以提高代码可靠性。
- 可读性:对于复杂的转换,首选命名函数。
- 性能:避免在处理大型数组时进行昂贵的操作。
- 不可变性:请记住 array_map 会创建新数组,而不会修改原始数组。
来源
本教程介绍了 PHP 的 array_map
函数,并通过实际示例展示了其在数组转换场景中的用法。
作者
列出 所有 PHP 数组函数。