繁体   English   中英

PHP array_filter 在包含多个 arrays 的数组上

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM