在多维数组中,使用php count+array_filter统计多个值的数量。

3
如何避免为每个要搜索的值重复编写相同的代码块?
我想通过在另一个多维数组($data)中计数特定值来创建新数组($result)。
    $result = array();

    $result['Insulin'] = count(array_filter($data,function ($entry) {
                                            return ($entry['choice'] == 'Insulin'); 
                                        }
                                    )
                                );

    $result['TZD'] = count(array_filter($data,function ($entry) {
                                            return ($entry['choice'] == 'TZD'); 
                                        }
                                    )
                                );

    $result['SGLT-2'] = count(array_filter($data,function ($entry) {
                                            return ($entry['choice'] == 'SGLT-2'); 
                                        }
                                    )
                                );
$data数组示例:
array(2) {
  [0]=>
  array(9) {
    ["breakout_id"]=>
    string(1) "1"
    ["case_id"]=>
    string(1) "1"
    ["stage_id"]=>
    string(1) "1"
    ["chart_id"]=>
    string(1) "1"
    ["user_id"]=>
    string(2) "10"
    ["region"]=>
    string(6) "Sweden"
    ["choice"]=>
    string(7) "Insulin"
    ["switched_choice"]=>
    NULL
    ["keep"]=>
    string(1) "1"
  }
  [1]=>
  array(9) {
    ["breakout_id"]=>
    string(1) "1"
    ["case_id"]=>
    string(1) "1"
    ["stage_id"]=>
    string(1) "1"
    ["chart_id"]=>
    string(1) "1"
    ["user_id"]=>
    string(1) "7"
    ["region"]=>
    string(6) "Sweden"
    ["choice"]=>
    string(7) "Insulin"
    ["switched_choice"]=>
    NULL
    ["keep"]=>
    string(1) "1"
  }
}
3个回答

2
您可以使用use关键字将匿名函数转换为闭包。传入一个字符串变量,用于匹配您想要的值。
// Array of strings to match and use as output keys
$keys = array('Insulin','TZD','SGLT-2');
// Output array
$result = array();

// Loop over array of keys and call the count(array_filter()) 
// returning the result to $result[$key]
foreach ($keys as $key) {
  // Pass $key to the closure
  $result[$key] = count(array_filter($data,function ($entry) use ($key) {
    return ($entry['choice'] == $key);
  }));
}

将您的var_dump()转换为数组并运行它,输出结果如下:
Array
(
    [Insulin] => 2
    [TZD] => 0
    [SGLT-2] => 0
)

您也可以使用array_count_values()来简化它:

$result2 = array_count_values(array_map(function($d) {
  return $d['choice'];
}, $data));

print_r($result2);

Array
(
    [Insulin] => 2
)

如果你需要将缺失的计数归零,可以使用array_merge()函数:
// Start with an array of zeroed values
$desired = array('Insulin'=>0, 'TZD'=>0, 'SGLT-2'=>0);
// Merge it with the results from above
print_r(array_merge($desired, $result2));
Array
(
    [Insulin] => 2
    [TZD] => 0
    [SGLT-2] => 0
)

2

虽然不是最节省内存的算法,但您可以将每个选择映射到一个新数组上,然后使用 array_count_values() 函数:

$result = array_count_values(array_map(function($item) {
  return $item['choice'];
}, $data));

自从5.5版本以后,您可以使用array_column()函数更简单地实现:

$result = array_count_values(array_column($data, 'choice'));

0

如果计数是您唯一的目标,那么您可以轻松简化代码:

$result = array();

foreach ($data AS $row) {
  if (!isset($result[$row['choice']])) {
    $result[$row['choice']] = 1;
  } else {
    $result[$row['choice']]++;
  }
}

如果您想仅计算特定的选择,您可以将上述代码更改为以下内容:
$result = array();
$keys = array('Insulin', 'TZD', 'SGLT-2');

foreach ($data AS $row) {
  if (!in_array($row['choice'], $keys)) {
    continue;
  }

  if (!isset($result[$row['choice']])) {
    $result[$row['choice']] = 1;
  } else {
    $result[$row['choice']]++;
  }
}

你可以执行 $keys = array_flip(['胰岛素', 'TZD', 'SGLT-2']); 然后稍后执行 if (!isset($keys[$row['choice'])) { continue; } - Ja͢ck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接