Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包含多个数组的数组上的PHP数组\过滤器_Php_Arrays_Array Filter - Fatal编程技术网

包含多个数组的数组上的PHP数组\过滤器

包含多个数组的数组上的PHP数组\过滤器,php,arrays,array-filter,Php,Arrays,Array Filter,在PHP中,当名为type的键的值与特定字符串匹配时,我将使用它拆分包含多个数组的数组。下面是它的样子: 样本数组 $arr[] = Array ( [0] => Array ( [type] => Recurring ... ) [1] => Array ( [type] => Single ... ) ) 功能 function recurring($value) { return ($value['type'] == 'Recurring'

在PHP中,当名为
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 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'));
实现相同功能的另一种方法是使用匿名函数(闭包)。不要想太多干燥的东西看起来很好:

$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\u type()
函数返回一个可调用的函数,这是
array\u filter
所期望的第二个参数。您可以返回一个匿名函数,并使用注释中提到的
use
关键字as
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\u type
函数中更改一次即可

使用闭包(匿名函数)有什么问题?
array\u filter($arr,key\u type('recurtive'),…
——当然,这不起作用,因为
key\u type('recurtive'))
是一个函数调用,而不仅仅是对一个函数的引用。//在这种情况下,
use
关键字很有用,@CBroe如果该函数本身返回一个匿名函数,那么它可能会起作用。然后,您可以按照您对返回的匿名函数的建议使用
use
关键字。我将发布一个答案。