PHP过滤器数组由另一个真/假数组组成

时间:2017-05-24 20:34:44

标签: php arrays filter

我有这个数组:

$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或其他内置函数)而不使用循环来实现此目的?

2 个答案:

答案 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_maparray_slicearray_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
)