我有以下数组
$topics_percentage = [
['id' => 8989, 'cat' => 'Category 1', 'completed' => 0],
['id' => 8919, 'cat' => 'Category 2', 'completed' => 1],
['id' => 8913, 'cat' => 'Category 2', 'completed' => 1],
['id' => 8947, 'cat' => 'Category 1', 'completed' => 1],
['id' => 8949, 'cat' => 'Category 3', 'completed' => 1],
];
我需要按类别值进行分组作为第一级键,然后根据已完成元素的0或1值有条件地统计每组中已完成和未完成的值。
想要的结果:
[
'Category 1' => [
'noncompleted' => 1,
'completed' => 1,
],
'Category 2' => [
'completed' => 2,
],
'Category 3' => [
'completed' => 1,
]
]
试试这个:
$values = array_unique(array_map(
function ($v) { return $v['cat']; },
$array
));
$result = array();
foreach ($values as $val) {
$flt = array_filter($array, function ($v) use ($val) {
return $v['cat'] == $val;
});
$cnt = count(array_filter($array, function ($v) use ($val) {
return $v['completed'];
}));
$result[$val] = array(
'completed' => $cnt,
'noncompleted' => count($flt) - $cnt
);
}
试试这个:
foreach ($topics_percentage as $v) {
$complete = $v['completed'];
if ($complete == 1) {
$class_array[$v['cat']]['completed']++;
} else {
$class_array[$v['cat']]['uncompleted']++;
}
}
当然,您应该在计算值之前预先初始化数组,但基本思想是使用数组单元格作为要添加或减去的数值。
使用数组解构仅访问每行所需的值并将它们声明为方便的变量。
使用 cat 值作为第一级键。
使用查找数组来确定第二级密钥。
迭代时,将当前值添加到先前存储的值(如果是第一次遇到,则为零)。
代码:(演示)
$result = [];
$lookup = ['noncompleted', 'completed'];
foreach ($topics_percentage as ['cat' => $cat, 'completed' => $comp]) {
$result[$cat][$lookup[$comp]] = ($result[$cat][$lookup[$comp]] ?? 0) + 1;
}
var_export($result);