You can convert your anonymous function to closure using a keyword use. Pass a string variable for the value you want to map.
$keys = array('Insulin','TZD','SGLT-2');
$result = array();
foreach ($keys as $key) {
$result[$key] = count(array_filter($data,function ($entry) use ($key) {
return ($entry['choice'] == $key);
}));
}
Converting var_dump()to an array and running it against it, the output:
Array
(
[Insulin] => 2
[TZD] => 0
[SGLT-2] => 0
)
You can also simplify it with array_count_values():
$result2 = array_count_values(array_map(function($d) {
return $d['choice'];
}, $data));
print_r($result2);
Array
(
[Insulin] => 2
)
, array_merge():
$desired = array('Insulin'=>0, 'TZD'=>0, 'SGLT-2'=>0);
print_r(array_merge($desired, $result2));
Array
(
[Insulin] => 2
[TZD] => 0
[SGLT-2] => 0
)