2017-05-24 89 views
1

我有此数组:PHP滤波器阵列由另一真/假阵列

$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

使用该溶液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 
) 
+0

谢谢@RomanPerekhrest。 有用的解决方案 – semsem

+1

@semsem,实际上,在这种情况下,您的“foreach”循环方法并不那么糟糕 – RomanPerekhrest