【问题标题】:PHP filter array by another true/false arrayPHP过滤数组由另一个真/假数组
【发布时间】:2017-05-24 20:34:44
【问题描述】:

我有这个数组:

$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 等内置函数或其他不使用循环的内置函数来实现这一点吗?

【问题讨论】:

  • “像array_***这样的内置函数”是用循环制作的。

标签: php arrays filter


【解决方案1】:

如果您使用的是 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()

【讨论】:

    【解决方案2】:

    使用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
    )
    

    【讨论】:

    • @semsem,实际上,在这种情况下,您的foreach 循环方法还不错
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2017-09-16
    相关资源
    最近更新 更多