回调函数array_filter()只传递数组的值,而不传递键。
有以下php代码:
$my_array = array(\"foo\" => 1, \"hello\" => \"world\");
$allowed = array(\"foo\", \"bar\");
我想删除$my_array数组中的元素,该元素的键不在$allowed数组
期望输出如下:
$my_array = array(\"foo\" => 1);
该如何实现呢?
第一种方法:
array_filter()函数在PHP 5.6引入了第三个参数flag,你可以设置为ARRAY_FILTER_USE_KEY通过键,而不是值来筛选:
$my_array = [\'foo\' => 1, \'hello\' => \'world\'];
$allowed = [\'foo\', \'bar\'];
$filtered = array_filter(
$my_array,
function ($key) use ($allowed) {
return in_array($key, $allowed);
},
ARRAY_FILTER_USE_KEY
);
显然,这并不像array_intersect_key($my_array, array_flip($allowed))那样优雅,但它确实提供了对键执行任意测试的额外灵活性,例如$allowed可以包含正则表达式而不是普通字符串。
您还可以使用ARRAY_FILTER_USE_BOTH将值和键传递给过滤器函数。这是一个基于第一个的人为例子,但请注意,我不建议使用$allowed这种方式编码过滤规则:
$my_array = [\'foo\' => 1, \'bar\' => \'baz\', \'hello\' => \'wld\'];
$allowed = [\'foo\' => true, \'bar\' => true, \'hello\' => \'world\'];
$filtered = array_filter(
$my_array,
function ($val, $key) use ($allowed) { // N.b. $val, $key not $key, $val
return isset($allowed[$key]) && (
$allowed[$key] === true || $allowed[$key] === $val
);
},
ARRAY_FILTER_USE_BOTH
); // [\'foo\' => 1, \'bar\' => \'baz\']
第二种方法:
使用闭包的更灵活的解决方案:
$my_array = array(\"foo\" => 1, \"hello\" => \"world\");
$allowed = array(\"foo\", \"bar\");
$result = array_flip(array_filter(array_flip($my_array), function ($key) use ($allowed)
{
return in_array($key, $allowed);
}));
var_dump($result);
输出:
array(1) {
\'foo\' =>
int(1)
} 继续阅读与本文标签相同的文章
-
老年痴呆症可望被治愈?人工智能算法已成功预测病症,太神奇了
2026-05-15栏目: 教程
-
华商传媒集团携手中国移动西安分公司,打造西部首个5G智慧文化产业园区
2026-05-15栏目: 教程
-
因现场技术原因,今晚南开大学纪念晚会直播取消
2026-05-15栏目: 教程
-
超级盛会!2019长沙空间信息产业国际博览会11月举办
2026-05-15栏目: 教程
-
2018年度重庆市科学技术奖获奖成果152项!集中在大数据、人工智能、智能制造等领域
2026-05-15栏目: 教程
