PHP常用数组函数解析

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 代码编程 发布于1个月前 更新于1个月前 106

一、核心数据处理函数

1. array_map - 批量处理器

array_map(callable $callback, array ...$arrays): array

array_map 函数的作用是将一个回调函数应用到多个数组的对应元素上,并返回一个新的数组,新数组的元素是回调函数的返回值。

参数解释

  • $callback:一个可调用的函数,该函数将应用到每个数组的对应元素上。这个函数接受的参数数量取决于传入的数组数量,例如,如果传入两个数组,那么回调函数将接受两个参数,分别是两个数组的对应元素。
  • $arrays:一个或多个数组,这些数组的对应元素将作为 $callback 函数的参数。

简单场景使用实例:价格加密

$prices = [99, 199, 299];
$encrypted = array_map(fn($n) => base64_encode((string)$n), $prices);
// 输出:['OTk=', 'MTk5', 'Mjk5']

在这个简单场景中,我们有一个包含价格的数组 $prices,我们想要对每个价格进行加密。通过 array_map 函数,我们将 base64_encode 函数作为回调函数应用到 $prices 数组的每个元素上,实现了对价格的加密。

复杂场景使用实例:矩阵转置

$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

$transposed = array_map(
    fn(...$col) => $col, 
    ...$matrix
);
/* 输出:
[
    [1,4,7],
    [2,5,8],
    [3,6,9]
]
*/

在这个复杂场景中,我们有一个二维数组 $matrix 表示一个矩阵。通过 array_map 函数,我们将一个匿名函数作为回调函数,该匿名函数接受多个参数并将它们组成一个数组。通过将 $matrix 数组展开作为 array_map 的参数,我们实现了矩阵的转置。

2. array_filter - 智能筛选器

array_filter(array $array, ?callable $callback = null, int $mode = 0): array

array_filter 函数用于过滤数组中的元素。它可以根据指定的回调函数来决定保留哪些元素,或者根据默认行为(如果没有提供回调函数)来过滤掉虚假值(如 false0null'' 等)。

参数解释

  • $array:要进行过滤的数组。
  • $callback:可选的回调函数。如果提供了这个函数,array_filter 将对 $array 中的每个元素调用该函数。如果回调函数返回 true,则该元素将被保留在结果数组中;如果返回 false,则该元素将被过滤掉。
  • $mode:可选的模式参数。它可以取以下值:
    • 0(默认值):回调函数只接受一个参数,即数组的元素。
    • ARRAY_FILTER_USE_KEY:回调函数接受两个参数,第一个是数组的键,第二个是数组的元素。
    • ARRAY_FILTER_USE_BOTH:回调函数接受两个参数,第一个是数组的键,第二个是数组的元素,并且键和元素都将作为回调函数的参数。

简单场景使用实例:过滤空值

$data = [1, 0, false, '', null];
$filtered = array_filter($data);
// 输出:[1]

在这个简单场景中,我们没有提供回调函数,array_filter 使用默认行为过滤掉了 $data 数组中的虚假值,只保留了 1

复杂场景使用实例:权限验证

$permissions = [
    'user.read' => true,
    'user.delete' => false,
    'admin.create' => true
];

$valid = array_filter(
    $permissions,
    fn($val, $key) => $val && str_contains($key, 'admin'),
    ARRAY_FILTER_USE_BOTH
);
// 输出:['admin.create' => true]

在这个复杂场景中,我们有一个包含权限信息的数组 $permissions。我们使用 array_filter 函数,并提供了一个回调函数和 ARRAY_FILTER_USE_BOTH 模式。回调函数检查权限值是否为 true 并且权限键是否包含 'admin',只有满足这些条件的权限才会被保留在结果数组中。

3. array_reduce - 数据聚合器

array_reduce(array $array, callable $callback, mixed $initial = null): mixed

array_reduce 函数将数组简化为一个单一的值。它通过迭代数组的每个元素,并使用回调函数将当前元素与一个累加器结合起来,最终返回累加器的值。

参数解释

  • $array:要进行简化的数组。
  • $callback:回调函数,该函数接受两个参数:累加器($carry)和当前数组元素($value)。回调函数应该返回一个新的累加器值,该值将在下一次迭代中使用。
  • $initial:可选的初始值。如果提供了这个值,它将作为累加器的初始值。如果没有提供,将使用数组的第一个元素作为初始值(如果数组不为空)。

简单场景使用实例:计算数组总和

$numbers = [1, 2, 3, 4];
$sum = array_reduce($numbers, fn($carry, $n) => $carry + $n, 0);
// 输出:10

在这个简单场景中,我们有一个包含数字的数组 $numbers。我们使用 array_reduce 函数,并提供了一个匿名回调函数和初始值 0。回调函数将累加器和当前元素相加,最终返回数组元素的总和。

复杂场景使用实例:电商统计

$orders = [
    ['amount' => 150, 'fee' => 5],
    ['amount' => 299, 'fee' => 8],
    ['amount' => 89, 'fee' => 2]
];

$total = array_reduce($orders, function($carry, $order) {
    $carry['total_amount'] += $order['amount'];
    $carry['total_fee'] += $order['fee'];
    return $carry;
}, ['total_amount' => 0, 'total_fee' => 0]);

// 输出:['total_amount' => 538, 'total_fee' => 15]

在这个复杂场景中,我们有一个包含订单信息的数组 $orders。我们使用 array_reduce 函数,并提供了一个匿名回调函数和初始值 ['total_amount' => 0, 'total_fee' => 0]。回调函数将每个订单的金额和费用累加到累加器中,最终返回包含总金额和总费用的数组。

二、数组结构操作函数

4. array_chunk - 分块处理器

array_chunk(array $array, int $length, bool $preserve_keys = false): array

array_chunk 函数将一个数组分割成多个指定长度的子数组。

参数解释

  • $array:要进行分割的数组。
  • $length:每个子数组的长度。
  • $preserve_keys:可选的布尔值参数。如果为 false(默认值),子数组的键将被重新索引为从 0 开始的连续整数;如果为 true,子数组将保留原始数组的键。

简单场景使用实例:数组分块

$data = [1, 2, 3, 4, 5];
$chunks = array_chunk($data, 2);
// 输出:[[1, 2], [3, 4], [5]]

在这个简单场景中,我们有一个包含数字的数组 $data。我们使用 array_chunk 函数将其分割成每个长度为 2 的子数组,结果是一个包含三个子数组的数组。

复杂场景使用实例:大文件分片上传

$fileBlocks = array_chunk(
    str_split(file_get_contents('bigfile.zip')), 
    1024 * 1024, // 1MB分块
    true
);

在这个复杂场景中,我们读取一个大文件的内容,并使用 str_split 函数将其分割成单个字符的数组。然后,我们使用 array_chunk 函数将这个字符数组分割成每个长度为 1MB 的子数组,并保留原始键。这样,我们可以将这些子数组逐个上传到服务器,实现大文件的分片上传。

5. array_splice - 元素替换器

array_splice(array &$input, int $offset, ?int $length = null, mixed $replacement = []): array

array_splice 函数从数组中移除指定数量的元素,并可以在移除的位置插入新的元素。

参数解释

  • $input:要进行操作的数组,这个参数是通过引用传递的,即函数会直接修改原始数组。
  • $offset:指定从数组的哪个位置开始移除元素。如果 $offset 为正数,从数组的起始位置开始计数;如果 $offset 为负数,从数组的末尾开始计数。
  • $length:可选参数,指定要移除的元素数量。如果省略或为 null,将从 $offset 位置开始移除到数组的末尾。如果 $length 为正数,移除指定数量的元素;如果 $length 为负数,移除从 $offset 位置到数组末尾倒数 $length 个元素之前的所有元素。
  • $replacement:可选参数,指定要插入到移除元素位置的新元素。可以是一个值或一个数组。

简单场景使用实例:删除元素

$array = [1, 2, 3, 4];
array_splice($array, 1, 2);
// 输出:[1, 4]

在这个简单场景中,我们有一个包含数字的数组 $array。我们使用 array_splice 函数从数组的第二个位置(索引为 1)开始移除 2 个元素,结果是数组变为 [1, 4]

复杂场景使用实例:动态修改配置

$config = ['db_host', 'db_user', 'cache_time'];
array_splice(
    $config, 
    2, 
    0, 
    ['db_pass', 'cache_type'] // 在位置2插入新元素
);
// 结果:['db_host','db_user','db_pass','cache_type','cache_time']

在这个复杂场景中,我们有一个包含配置项的数组 $config。我们使用 array_splice 函数从数组的第三个位置(索引为 2)开始移除 0 个元素,并在该位置插入两个新的配置项 ['db_pass', 'cache_type'],结果是数组变为 ['db_host', 'db_user', 'db_pass', 'cache_type', 'cache_time']

6. array_flip - 键值翻转器

array_flip(array $array): array

array_flip 函数用于翻转数组的键和值,即原来的键变为值,原来的值变为键。

参数解释

  • $array:要进行键值翻转的数组。

简单场景使用实例:翻转键值

$colors = ['red' => '#FF0000', 'green' => '#00FF00'];
$flipped = array_flip($colors);
// 输出:['#FF0000' => 'red', '#00FF00' => 'green']

在这个简单场景中,我们有一个包含颜色名称和对应颜色代码的数组 $colors。我们使用 array_flip 函数将其键值翻转,得到一个新的数组,其中颜色代码作为键,颜色名称作为值。

复杂场景使用实例:快速查找重复值

$data = ['a', 'b', 'a', 'c'];
$unique = array_flip(array_flip($data));
// 输出:['a', 'b', 'c'](保留最后一个出现位置)

在这个复杂场景中,我们有一个包含重复元素的数组 $data。我们首先使用 array_flip 函数将数组的键值翻转,这样重复的元素会覆盖之前的键值。然后,我们再次使用 array_flip 函数将键值翻转回来,这样就得到了一个去除重复元素的数组,并且保留了最后一个出现的元素的位置。

7. array_intersect - 数据交集体

array_intersect(array $array, array ...$arrays): array

array_intersect 函数用于计算多个数组的交集,即返回一个包含所有数组中都存在的元素的数组。

参数解释

  • $array:第一个数组,作为比较的基准。
  • $arrays:一个或多个其他数组,这些数组将与第一个数组进行比较。

简单场景使用实例:查找交集

$array1 = [1, 2, 3];
$array2 = [2, 3, 4];
$intersect = array_intersect($array1, $array2);
// 输出:[2, 3]

在这个简单场景中,我们有两个包含数字的数组 $array1$array2。我们使用 array_intersect 函数计算它们的交集,结果是一个包含 23 的数组,因为这两个元素在 $array1$array2 中都存在。

复杂场景使用实例:权限交集

$userPerms = ['read', 'write', 'delete'];
$allowedPerms = ['read', 'edit'];

$validPerms = array_intersect($userPerms, $allowedPerms);
// 输出:['read']

在这个复杂场景中,我们有一个包含用户权限的数组 $userPerms 和一个包含允许权限的数组 $allowedPerms。我们使用 array_intersect 函数计算它们的交集,结果是一个只包含 'read' 的数组,因为只有 'read' 权限在两个数组中都存在。

三、高级数据处理函数

8. array_walk_recursive - 递归遍历器

array_walk_recursive(array &$array, callable $callback, mixed $userdata = null): bool

array_walk_recursive 函数递归地遍历数组中的所有元素,并对每个元素应用指定的回调函数。

参数解释

  • $array:要进行遍历的数组,这个参数是通过引用传递的,即函数会直接修改原始数组。
  • $callback:回调函数,该函数接受两个参数:当前元素的值($value)和当前元素的键($key)。回调函数还可以接受第三个参数 $userdata,如果提供了的话。
  • $userdata:可选参数,将作为第三个参数传递给回调函数。

简单场景使用实例:递归修改值

$data = ['a' => 1, 'b' => ['c' => 2]];
array_walk_recursive($data, function(&$v) {
    $v *= 2;
});
// 输出:['a' => 2, 'b' => ['c' => 4]]

在这个简单场景中,我们有一个包含嵌套数组的数组 $data。我们使用 array_walk_recursive 函数,并提供了一个匿名回调函数。回调函数将每个元素的值乘以 2,实现了对数组中所有元素的递归修改。

复杂场景使用实例:多维数组清洗

$data = [
    'user' => ['name' => ' John ', 'tags' => [' php ', '  dev ']],
    'log' => ['  error ', 'warning  ']
];

array_walk_recursive($data, function(&$v) {
    $v = trim($v);
});
/* 输出:
[
    'user' => ['name' => 'John', 'tags' => ['php','dev']],
    'log' => ['error','warning']
]
*/

在这个复杂场景中,我们有一个包含嵌套数组的多维数组 $data,其中包含一些字符串,这些字符串可能包含多余的空格。我们使用 array_walk_recursive 函数,并提供了一个匿名回调函数。回调函数使用 trim 函数去除每个字符串的首尾空格,实现了对多维数组中所有字符串的清洗。

9. array_diff_ukey - 键名差异分析

array_diff_ukey(array $array, array ...$arrays, callable $key_compare_func): array

array_diff_ukey 函数用于比较多个数组的键名,并返回在第一个数组中存在但在其他数组中不存在的键名及其对应的值。比较键名时使用指定的回调

THE END

喜欢就支持一下吧!

版权声明:除却声明转载或特殊注明,否则均为艾林博客原创文章,分享是一种美德,转载请保留原链接,感谢您的支持和理解

有志者,事意成

民谚

推荐阅读

Mysql新建一个用户并赋予最高权限

本文详细介绍了如何在MySQL数据库管理系统中创建一个新用户,并赋予其最高权限。通过逐步指导,包括以root用户登录、创...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 07月03日

Composer 如何切换到中国镜像

本文提供了详细的步骤来指导PHP开发者如何将Composer的默认镜像源切换至中国镜像,以加快依赖包的下载速度,包括全局...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月05日

Linux df 和 du 命令详解

这篇文章详细介绍了Linux系统中df和du命令的用法及其常见选项,帮助用户监控和管理磁盘空间使用情况。文章还提供了多个...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 09月12日

PHP中的任意精度数学计算:探索BCMath扩展

详细介绍使用PHP BCMath扩展进行高精度数学计算的方法,包括加法、减法、乘法、除法、求余、乘方、平方根计算以及设置...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月07日

PHP 执行时间与内存管理解析

本文详解PHP脚本的max_execution_time、memory_limit核心参数,对比Nginx与PHP-FP...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 02月25日

PHP常用数组函数解析

PHP常用数组函数解析,完整解析核心函数,包含参数类型、模式常量、多维数组处理等高级技巧,提供简单到企业级的实战案例演示...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 02月26日

深入浅出:后端开发中的缓存机制

这篇文章深入探讨了后端开发中的缓存机制,包括缓存的定义、分类、常见使用场景、挑战与解决方案,以及如何选择合适的缓存工具,...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 01月15日

PHP 一匿名函数、回调函数和闭包函数的介绍

本文详细介绍了PHP中的匿名函数、回调函数和闭包函数的概念、用法和具体示例。匿名函数是没有名字的函数,可以在任何需要函数...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 02月23日