2014-09-29 89 views
-2

我已经做了很多环视互联网寻找解决我的问题,但没有任何工作,我的具体情况。在数组中分组值

我的小时和活跃用户的阵列如下:

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 
     ) 
    ) 

我试图组的所有值,其中[时间]是相同的,并且让用户的平均该时间。因此,在这个例子中,用户对于07:00是2.33,四舍五入到2

我想清楚地,我希望,这有一定道理...

+1

似乎很直接的给我。你有什么尝试? – 2014-09-29 03:27:12

+0

我试着用array_unique(),用序列化和反序列化等很多东西,但是每次我得到相同的数组。也许这会更容易,如果我在格式化时间(从8点13分到8点等)的同时做到这一点? – powerthepower 2014-09-29 03:32:04

回答

2

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

$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); 
+0

你是我的救星!我不知道我的这个想法是不是出了什么问题。可能我必须只是在推翻:) – powerthepower 2014-09-29 03:47:55

0

那么,由于你的数据结构如何,你将不得不通过两遍。首先,您需要格式化数据,使其变得可用。一旦完成,您可以继续计算平均值。

给出了一些数据:

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