我在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);
答案 0 :(得分:2)
一种方法如下,但我不老实。
$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'));
实现同样功能的另一种方法是使用匿名函数(闭包)。不要过多考虑干,这似乎很好看:
$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';
});
答案 1 :(得分:2)
你实际上可以在你的问题中做你提出的建议。您只需要让key_type()
函数返回一个可调用函数,这是array_filter
期望的第二个参数。您可以使用注释中提到的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
函数中更改一次。