PHP array_filter 包含多个数组的数组

PHP array_filter on array containing multiple arrays

我在 PHP 中使用 array_filter 在名为 type 的键的值与特定字符串匹配时拆分包含多个数组的数组。这是它的样子:

样本数组

$arr[] = Array (
    [0] => Array ( [type] => Recurring ... )
    [1] => Array ( [type] => Single ... )
)

函数

function recurring($value)
{
    return ($value['type'] == 'Recurring');
}

function single($value)
{
    return ($value['type'] == 'Single');
}

拆分数组

$recurring = array_filter($arr, 'recurring');
$single    = array_filter($arr, 'single');

这行得通,但我很好奇是否有一种方法可以简化它,以便我可以在将来创建额外的过滤数组而无需为每个数组创建新函数。

我已经开始使用闭包设置单个函数,但不确定如何操作。有什么想法吗?

function key_type($value, $key, $string) {
    return $key == 'type' && $value == $string;
}

$recurring = array_filter($arr, 
key_type('Recurring'), ARRAY_FILTER_USE_BOTH);

$single = array_filter($pricing, 
key_type('Single'), ARRAY_FILTER_USE_BOTH);

一种方法如下所示,但老实说我不喜欢它。

$array = [['type' => 'Single'], ['type' => 'Recurring']];

function key_type($value) {
    global $string;
    return $value['type'] == $string;
}

($string = 'Recurring') && ($recurring = array_filter($array, 'key_type'));

($string = 'Single') && ($single = array_filter($array, 'key_type'));

实现相同目的的另一种方法是使用匿名函数(闭包)。不要想太多 DRY 看起来不错:

$array = [['type' => 'Single'], ['type' => 'Recurring']];

$recurring = array_filter($array, function($value) {
    return $value['type'] == 'Recurring';
});

$single = array_filter($array, function($value) {
    return $value['type'] == 'Single';
});

您实际上可以按照您在问题中提出的建议进行操作。您只需要让 key_type() 函数 return 成为一个可调用函数,这是 array_filter 期望的第二个参数。您可以 return 匿名函数并使用 use 关键字将参数传递给匿名函数,如评论中提到的 CBroe

这是一个例子:

function key_type($key) {
    return function($value) use ($key) {
        return $value['type'] == $key;
    };
}

$arr = array(
    array('type'=>'Recurring'),
    array('type'=>'Single')
);
print_r(array_filter($arr, key_type('Single'), ARRAY_FILTER_USE_BOTH));

以上代码会输出:

Array ( [1] => Array ( [type] => Single ) )

这种方法的优点在于,如果您需要更改所有需要使用过滤器的实例的逻辑,只需在 key_type 函数中更改一次即可。