Группировка значений в массиве

Я много смотрел в Интернете, чтобы найти решение моей проблемы, но ничего не помогло в моем конкретном случае.

У меня есть массив часов и активных пользователей, как указано ниже:

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.

Я старался быть максимально понятным и надеюсь, что в этом есть какой-то смысл …

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

По вопросам рекламы [email protected]