2014-09-29 3 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

Кажется довольно прямо вперед для меня. Что вы пробовали? –

+0

Я попытался с array_unique(), с сериализацией и unserializing, и многое другое, но каждый раз, когда я получил тот же массив обратно. Может быть, было бы проще, если бы я сделал это одновременно с форматированием (с 8:13 до 8:00 и т. Д.)? – powerthepower

ответ

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

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); 
Смежные вопросы