一尘不染

如何在PHP数组中递归运行array_filter?

php

给定以下数组 $mm

Array
(
    [147] => Array
        (
            [pts_m] => 
            [pts_mreg] => 1
            [pts_cg] => 1
        )    
    [158] => Array
        (
            [pts_m] => 
            [pts_mreg] => 
            [pts_cg] => 0
        )

    [159] => Array
        (
            [pts_m] => 
            [pts_mreg] => 1
            [pts_cg] => 1
        )

)

当我运行时,由于它不是递归的,所以会count(array_filter($mm))得到3结果。

count(array_filter($mm), COUNT_RECURSIVE)也不会这样做,因为我实际上需要array_filter递归运行,然后计算其结果。

所以我的问题是:array_filter($mm)在这种情况下如何递归运行?我的预期结果是4

请注意,我没有使用任何回调,因此可以排除false,null和empty。


阅读 325

收藏
2020-05-29

共1个答案

一尘不染

应该管用

$count = array_sum(array_map(function ($item) {
  return ((int) !is_null($item['pts_m'])
       + ((int) !is_null($item['pts_mreg'])
       + ((int) !is_null($item['pts_cg']);
}, $array);

或许

$count = array_sum(array_map(function ($item) {
  return array_sum(array_map('is_int', $item));
}, $array);

肯定还有更多可能的解决方案。如果你想使用array_filter()(没有回调)记住,它把0false过,因此它会 删除
任何0从数组-值。

如果您在5.3之前的版本中使用PHP,则应使用foreach-loop

$count = 0;
foreach ($array as $item) {
  $count += ((int) !is_null($item['pts_m'])
          + ((int) !is_null($item['pts_mreg'])
          + ((int) !is_null($item['pts_cg']);
}

更新资料

关于以下评论:

Thx @kc我实际上希望该方法删除false,0,空等

当这仅仅是您想要的时,解决方案也非常简单。但是现在我不知道该如何解释

我的预期结果是5。

无论如何,它现在很短:)

$result = array_map('array_filter', $array);
$count = array_map('count', $result);
$countSum = array_sum($count);

结果数组看起来像

Array
(
[147] => Array
    (
        [pts_mreg] => 1
        [pts_cg] => 1
    )    
[158] => Array
    (
    )

[159] => Array
    (
        [pts_mreg] => 1
        [pts_cg] => 1
    )

)
2020-05-29