我想根据两个列的值对一些行的数据进行分组和求和。
我的输入是:
$array = [
['FA',12.9],
['FA',12.9],
['FB',12.2],
['FC',12.3],
['FA',12.9],
['FB',12.9],
['FA',12.4],
];
我想将分组后的行值打印为一个字符串,然后是一个x和出现的总次数,格式如下:
FA 12.9x3 FB 12.2x3
我已经编写了代码来计算每个组中值的出现次数,但是我不知道如何以这种格式打印出来:
$new = [];
foreach ($array as $key=> $value) {
if (!array_key_exists($value[0],$new)) {
$new[$value[0]]=[strval($value[1])=>1];
}
else {
if (!array_key_exists(strval($value[1]),$new[$value[0]])) {
$new[$value[0]][strval($value[1])]=1;
// $no+=1;
}
else {
$count= $new[$value[0]];
$count=$count[strval($value[1])];
$count+=1;
$new[$value[0]][strval($value[1])]=$count;
}
}
}
这个代码可以优化并以正确的格式打印出来吗?
期望的输出:
FA 12.9x3 FB 12.2x1 FC 12.3x1 FB 12.9x1 FA 12.4x1
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
使用
array_reduce以一种特殊而有用的方式,我们可以按名称将项目进行分组。然后再按值进行分组并计数。这个想法是传递一个累积值作为键的数组。$g = array($a, $b, $c, $d, $e, $f, $h); $result = array_reduce($g, function ($carry, $item) { $key = $item[0]; $value = $item[1]; if (!isset($carry[$key])) { $carry[$key] = []; } if (!isset($carry[$key][(string) $value])) { $carry[$key][(string) $value] = 0; } $carry[$key][(string) $value]++; return $carry; }, []); print_r($result);输出:
Array ( [FA] => Array ( [12.9] => 3 [12.4] => 1 ) [FB] => Array ( [12.2] => 1 [12.9] => 1 ) [FC] => Array ( [12.3] => 1 ) )