array_filter() 是 PHP 中常用的函数之一,用于过滤数组中的元素。通常情况下,array_filter() 只会返回符合条件的数组值,并且默认会重置数组的键名,即保留从 0 开始的连续整数键名。但有时候,我们希望在过滤数组时能够保留原始的键名。本文将介绍如何在使用 array_filter() 时保留数组的键名。
在讨论如何保留键名之前,首先来看一下 array_filter() 的基本用法。array_filter() 函数会遍历数组并根据回调函数的返回值决定是否保留数组中的元素。如果回调函数返回 true,则该元素将被保留,否则会被移除。
<?php
$array = [1, 2, 3, 4, 5];
$result = array_filter($array, function($value) {
return $value % 2 === 0; // 只保留偶数
});
print_r($result);
?>
输出结果:
Array
(
[1] => 2
[3] => 4
)
如上所示,array_filter() 会过滤数组,但会重置键名。在这个例子中,array_filter() 的输出数组键名从 0 开始,而我们希望保留原始数组的键名。
PHP 提供了一个常用的解决方法,使用 array_filter() 的第三个参数 ARRAY_FILTER_USE_KEY。当使用这个常量时,array_filter() 将基于键名而不是值来执行回调函数,从而可以在过滤时保留键名。
<?php
$array = [1 => 10, 2 => 20, 3 => 30, 4 => 40, 5 => 50];
$result = array_filter($array, function($key) {
return $key % 2 === 0; // 保留偶数键
}, ARRAY_FILTER_USE_KEY);
print_r($result);
?>
输出结果:
Array
(
[2] => 20
[4] => 40
)
在这个例子中,我们使用了 ARRAY_FILTER_USE_KEY,使得回调函数的参数是数组的键,而不是值。这样,我们就可以基于键名的条件来过滤数组,同时保留原始的键名。
假设我们有一个数组,其中包含了多个 URL 地址,我们希望过滤出包含 m66.net 域名的地址,并保留原始的键名。
<?php
$urls = [
'a' => 'http://example.com/page1',
'b' => 'https://m66.net/page2',
'c' => 'http://m66.net/page3',
'd' => 'https://example.com/page4',
];
$result = array_filter($urls, function($url) {
return strpos($url, 'm66.net') !== false; // 筛选出包含 m66.net 的 URL
});
print_r($result);
?>
输出结果:
Array
(
[b] => https://m66.net/page2
[c] => http://m66.net/page3
)
如上所示,array_filter() 筛选出了包含 m66.net 的 URL 地址,并保留了它们的键名(b 和 c)。
array_filter() 函数非常强大,可以用来过滤数组,但默认情况下会重置数组的键名。如果我们想要保留数组的键名,只需在使用 array_filter() 时指定 ARRAY_FILTER_USE_KEY 常量,这样回调函数就会接受数组的键,而非仅仅是值。
通过这种方式,你可以根据键名或值的条件灵活地筛选数组,并保留原始键名,保持数组的结构完整。