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
,以便我可以在表中使用该值。然后我需要对每个分组的值求和。
我会在从数据库读取数据的循环中进行所有必要的数学运算。像这样的东西:
$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>";
要获得平均水平,您可以执行以下操作:
foreach ($groups as $name => $group) {
$average = array_sum(array_column($group, 'rating')) / count($group);
echo $name;
}
您可以首先在用于处理这些日期的结构中简化问题
foreach($fields as $field) {
$mods[$field['name']][] = $field['rating'];
}
然后只需使用关键参数进行 foreach
foreach($mods as $name => $mod) {
echo $name;
echo array_sum($mod) / count($mod);
}
尝试使用下面的代码。消除准备组数组的额外循环。
$mods = array();
foreach($fields as $field) {
$mods[$field['name']][] = $field['rating'];
}
<table>
<tr>
<?php
if($mods) {
foreach($mods as $key=>$value) {
?>
<td><?php echo $key; ?></td>
<td><?php echo (array_sum($value)/count($value)); ?></td>
<?php
}
}
?>