首页 > 解决方案 > 在 PHP 中按键和求和值对多维数组进行分组

问题描述

Stack Overflow 上也有类似的问题,但与我的完全不同,我还想仔细检查一下我这样做是不是最有效的方式(资源方面)。

我有提交的调查,我想统计结果。每个调查都保存在一个多维数组中,如下所示:

Array ( [name] => Clark Kent [rating] => 5 )

这些来自循环,因为它们是单独的数据库条目。

所以我首先创建一个包含所有这些组合的新数组:

$mods = array();
$index = -1;
foreach($fields as $field) {
  $index++;
  $mods[$index]['name'] = $field['name'];
  $mods[$index]['rating'] = $field['rating'];
}

然后我将这些分组,以便同名的所有评级都放在一起,以便我以后可以总结它们。

$groups = array();
foreach ($mods as $value) {
  $groups[$value['name']][] = $value;
}

这会产生以下结果:

Array ( 
  [Clark Kent] => Array (
    [0] => Array (
        [name] => Clark Kent
        [rating] => 5
        )
    [1] => Array (
        [name] => Clark Kent
        [rating] => 5
        )
    )
[Peter Parker] => Array (
    [0] => Array (
        [name] => Peter Parker
        [rating] => 5
        )
    [1] => Array (
        [name] => Peter Parker
        [rating] => 5
        )
    )
[Bruce Wayne] => Array (
    [0] => Array (
        [name] => Bruce Wayne
        [rating] => 5
        )
    [1] => Array (
        [name] => Bruce Wayne
        [rating] => 5
        )
    )
[Bruce Banner] => Array (
    [0] => Array (
        [name] => Bruce Banner
        [rating] => 5
        )
    [1] => Array (
        [name] => Bruce Banner
        [rating] => 5
        )
    )
)

我想要完成的是这样的:

<table>
  <tr>
    <td>Clark Kent</td>
    <td>{average of all ratings}</td>
  </tr>
</table>

我大部分时间都在那里,但我被卡住了!我不确定如何获取name没有任何类型的索引或键的分组,以便我可以将该值用于我的表。然后我需要对每个分组值求和。

标签: phparrays

解决方案


我会在从数据库中读取数据的循环中进行所有必要的数学运算。像这样的东西:

$ratings = array();
while ($row = $result->fetch_assoc()) {
    $name = $row['name'];
    if (!isset($ratings[$name])) {
        $ratings[$name] = array('count' => 1, 'sum' => $row['rating']);
    }
    else {
        $ratings[$name]['count']++;
        $ratings[$name]['sum'] += $row['rating'];
    }
}

然后你可以像这样输出你的表:

echo "<table>";
foreach ($ratings as $name => $r) {
    echo "<tr><td>$name</td><td>" . round($r['sum'] / $r['count'], 1) . "</td></tr>";
}
echo "</table>";

推荐阅读