![](/img/trans.png)
[英]PHP array_filter - How to array_filter arrays using multiple keys in the callback function?
[英]PHP array_filter on array containing multiple arrays
当名为type
的键的值与特定字符串匹配时,我在PHP中使用 array_filter 来拆分包含多个 arrays 的数组。 这是这样的:
样本数组
$arr[] = Array (
[0] => Array ( [type] => Recurring ... )
[1] => Array ( [type] => Single ... )
)
功能
function recurring($value)
{
return ($value['type'] == 'Recurring');
}
function single($value)
{
return ($value['type'] == 'Single');
}
分体Arrays
$recurring = array_filter($arr, 'recurring');
$single = array_filter($arr, 'single');
这行得通,但我很好奇是否有一种方法可以简化它,以便我可以在未来创建额外的过滤 arrays 而不为每个创建新的 function。
我已经开始使用闭包设置单个 function,但我不知道该怎么做。 有任何想法吗?
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_type()
函数返回一个可调用函数,这是array_filter
期望的第二个参数。 您可以返回一个匿名函数,并使用use
关键字将参数传递给匿名函数,如CBroe
提到的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
在于,如果您需要更改需要使用过滤器的所有实例的逻辑,则只需在key_type
函数中更改一次。
这个任务可能更多的是关于分组而不是过滤——很难从有限的样本数据中辨别出来。
作为一般规则,我强烈建议不要在 PHP 代码中使用可变变量。 出于可访问性原因,最好将数据存储在 arrays 中。
如果您的项目数据中只有提到的两个type
值,则可以完全删除条件。
代码:(演示)
$array = [
['type' => 'Recurring', 'id' => 1],
['type' => 'Single', 'id' => 2],
['type' => 'Other', 'id' => 3],
['type' => 'Recurring', 'id' => 4],
['type' => 'Single', 'id' => 5],
];
$result = [];
foreach ($array as $row) {
if (in_array($row['type'], ['Recurring', 'Single'])) {
$result[strtolower($row['type'])][] = $row;
}
}
var_export($result);
Output:
array (
'recurring' =>
array (
0 =>
array (
'type' => 'Recurring',
'id' => 1,
),
1 =>
array (
'type' => 'Recurring',
'id' => 4,
),
),
'single' =>
array (
0 =>
array (
'type' => 'Single',
'id' => 2,
),
1 =>
array (
'type' => 'Single',
'id' => 5,
),
),
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.