将行数据分组到二维数组中并计算每组中列的平均值

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

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
,以便我可以在表中使用该值。然后我需要对每个分组的值求和。

php arrays multidimensional-array grouping average
4个回答
5
投票

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

$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>";

2
投票

要获得平均水平,您可以执行以下操作:

foreach ($groups as $name => $group) {
    $average = array_sum(array_column($group, 'rating')) / count($group);
    echo $name;
}

2
投票

您可以首先在用于处理这些日期的结构中简化问题

foreach($fields as $field) {
     $mods[$field['name']][] = $field['rating'];
}

然后只需使用关键参数进行 foreach

foreach($mods as $name => $mod) {
     echo $name;
     echo array_sum($mod) / count($mod);
}

1
投票

尝试使用下面的代码。消除准备组数组的额外循环。

$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 
    }
}
?>

© www.soinside.com 2019 - 2024. All rights reserved.