2017-05-24 84 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