包含多个数组

时间:2018-01-09 15:39:26

标签: php arrays array-filter

我在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);

2 个答案:

答案 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函数中更改一次。