我有这个数组:
$arr_to_filter = array(1, 3, 5, 7, 10, 12, 15);
$filter = array(0, 1, 1, 0, 1);
预期结果:
Array (
[0] => 3
[1] => 5
[2] => 10
)
我可以通过这个循环实现这个目标:
$arr_to_filter = array(1, 3, 5, 7, 10, 12, 15);
$filter = array(0, 1, 1, 0, 1);
$output_array = array();
foreach($arr_to_filter as $key=>$val) {
if(isset($filter[$key]) && $filter[$key]) {
$output_array[] = $val;
}
}
print_r($output_array);
我是否可以使用内置函数(如array_filter或其他内置函数)而不使用循环来实现此目的?
答案 0 :(得分:3)
如果您使用的是PHP> = 5.6,则可以利用array_filter()
的第三个参数,允许您将密钥与过滤器集匹配:
$arr_to_filter = array(1, 3, 5, 7, 10, 12, 15);
$filter = array(0, 1, 1, 0, 1);
$result = array_filter(
$arr_to_filter,
function($key) use ($filter) {
return !empty($filter[$key]);
},
ARRAY_FILTER_USE_KEY
);
var_dump($result);
如果您使用的是早期版本的PHP,则需要对键进行过滤,并将结果与原始数组相交:
$result = array_intersect_key(
$arr_to_filter,
array_filter(
array_keys($arr_to_filter),
function($key) use ($filter) {
return !empty($filter[$key]);
}
)
);
如果您想在这些方法之一后重置密钥,请使用array_values()
答案 1 :(得分:1)
使用array_map
,array_slice
和array_reduce
函数的解决方案:
$filtered = array_reduce(array_map(null, array_slice($arr_to_filter, 0, count($filter)), $filter),
function($r, $a){
if ($a[1]) $r[] = $a[0];
return $r;
}, []);
print_r($filtered);
输出:
Array
(
[0] => 3
[1] => 5
[2] => 10
)