将二维数组中的数据按一列进行分组,然后有条件地填充组内的键并计算子数组键出现的次数

问题描述 投票:0回答:3

我有以下数组

$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,
    ]
]
php arrays multidimensional-array count grouping
3个回答
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
    );
}

0
投票

试试这个:

    foreach ($topics_percentage as $v) {

        $complete = $v['completed'];

        if ($complete == 1) {
            $class_array[$v['cat']]['completed']++;
        } else {
            $class_array[$v['cat']]['uncompleted']++;
        }
    }

当然,您应该在计算值之前预先初始化数组,但基本思想是使用数组单元格作为要添加或减去的数值。


0
投票

使用数组解构仅访问每行所需的值并将它们声明为方便的变量。

使用 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);
© www.soinside.com 2019 - 2024. All rights reserved.