一、核心数据处理函数
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
函数用于过滤数组中的元素。它可以根据指定的回调函数来决定保留哪些元素,或者根据默认行为(如果没有提供回调函数)来过滤掉虚假值(如 false
、0
、null
、''
等)。
参数解释:
$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
函数计算它们的交集,结果是一个包含 2
和 3
的数组,因为这两个元素在 $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
函数用于比较多个数组的键名,并返回在第一个数组中存在但在其他数组中不存在的键名及其对应的值。比较键名时使用指定的回调
喜欢就支持一下吧!
版权声明:除却声明转载或特殊注明,否则均为艾林博客原创文章,分享是一种美德,转载请保留原链接,感谢您的支持和理解