2014-09-29 51 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);