【问题标题】:Grouping values in array对数组中的值进行分组
【发布时间】:2014-09-29 11:50:24
【问题描述】:

我已经在互联网上进行了很多查找以找到解决我的问题的方法,但对于我的具体情况没有任何帮助。

我有一系列小时数和活跃用户如下:

Array ( 
    [0] => Array ( 
        [time] => 05:00 ,
        [users] => 0
        ),
    [1] => Array ( 
        [time] => 06:00,
        [users] => 0
        ),
    [2] => Array ( 
        [time] => 07:00,
        [users] => 1
        ),
    [3] => Array ( 
        [time] => 07:00,
        [users] => 3
        )
    [4] => Array ( 
        [time] => 07:00,
        [users] => 3
        ),
    [5]=> Array ( 
        [time] => 08:00,
        [users] => 0
        )
    ) 

我正在尝试对 [time] 相同的所有值进行分组,并获取该时间的用户平均值。所以在本例中,07:00 的用户数为 2,33,四舍五入为 2。

我试图尽可能清楚,并希望这是有道理的......

【问题讨论】:

  • 对我来说似乎很简单。你试过什么?
  • 我尝试过使用 array_unique(),进行序列化和反序列化以及许多其他操作,但每次我得到相同的数组。如果我在格式化时间(从 8:13 到 8:00 等)同时这样做,也许会更容易?

标签: php multidimensional-array unique-values


【解决方案1】:

创建一个新数组,其中键是时间,值是该时间的用户值数组。然后通过将值的总和除以其元素数将值转换为平均值。

$grouped_by_time = array();

foreach($array as $element) {
    $grouped_by_time[$element['time']][] = $element['users'];
}

foreach($grouped_by_time as &$element) {
    $element = round(array_sum($element)/count($element));
}

print_r($grouped_by_time);

【讨论】:

  • 你是我的救星!我不知道我有什么问题没有提出这个想法。可能我只是想多了:)
【解决方案2】:

好吧,由于您的数据是如何结构化的,您将不得不分两次完成。首先,您需要以使其可用的方式格式化数据。完成后,您可以继续计算平均值。

给定一些数据:

$data = [
    ['time' => '05:00', 'users' => 0],
    ['time' => '06:00', 'users' => 0],
    ['time' => '07:00', 'users' => 1],
    ['time' => '07:00', 'users' => 3],
    ['time' => '07:00', 'users' => 3],
    ['time' => '08:00', 'users' => 0],
];

重新格式化以使其可用:

$coll = [];
foreach ($data as $item) {
    $time = $item['time'];
    if ( ! isset($coll[$time])) {
        $coll[$time] = [];
    }
    $coll[$time][] = $item['users'];
}

然后计算平均值:

echo '<pre>';
foreach ($coll as $time => $entries) {
    $sum = array_sum($entries);
    $avg = round($sum / count($entries));
    echo "{$time} had an average of {$avg} users\n";
}
var_dump($coll);

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 2017-11-07
    • 2011-11-26
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多