Ассоциативный массив, значения одного и того же ключа: получить суммы и средние значения братьев и сестер

Я хотел бы расширить поток, найденный в Ассоциативный массив, значения суммы тот же ключ.

Таблица

ОП спрашивает:

Вместо того, чтобы клавиша «Конференция» повторялась 3 раза. Я хочу иметь его только один раз и суммировать 3 значения в одно по порядку.

Дан ответ:

 $sum = array_reduce($data, function ($a, $b) {
     isset($a[$b['event']]) ? $a[$b['event']]['budget'] += $b['budget'] : $a[$b['event']] = $b;  
     return $a; });

У меня есть ассоциативный массив с более чем двумя значениями. Я хотел бы использовать функцию, подобную приведенной выше, но сложить вместе все ключевые значения, а не только "бюджет". Вот пример, который отражает мою ситуацию:

Массив выглядит следующим образом:

$data = array(
   0 => array(
     'event' => 'Conference',
     'budget' => 3700,
     'people' => 200,
     'rate' => 3000, 
  ),
  1 => array(
    'event' => 'Conference',
    'budget' => 500,
    'people' => 200,
    'rate' => 6000,
  ),
  2 => array(
    'event' => 'Showroom',
    'budget' => 1000,
    'people' => 400,
    'rate' => 30000,
  ),
  3 => array(
    'event' => 'Mission Chez client',
    'budget' => 2000,
    'people' => 200,
    'rate' => 3000,
  ),
  4 => array(
    'event' => 'Séminaire',
    'budget' => 700,
    'people' => 40,
    'rate' => 3000,
  ),
  5 => array(
    'event' => 'Livraison',
    'budget' => 4000,
    'people' => 2,
    'rate' => 3000,
  ),
  6 => array(
    'event' => 'Conference',
    'budget' => 334,
    'people' => 200,
    'rate' => 9000,
  ),
);

Если я использую приведенный выше код, я смогу сократить «Конференцию» до одной записи следующим образом:

[0] => Array
        (
            [event] => Conference
            [budget] => 4534
            [people] => 200
            [rate] => 5000
        )

Бюджетная цифра верна. Но фигура людей - нет. Как я мог получить сумму «людей» и «бюджета», чтобы [люди] => 600?

Наконец, возможно ли легко получить среднее значение для параметра "ставка"? Таким образом, для конференции это будет ((3000+6000+9000) / 3 = 6000).

В общем, я пытаюсь организовать таблицу, чтобы получить результат вроде:

[0] => Array
            (
                [event] => Conference  // Key that appears multiple times
                [budget] => 4534  //Sum of all conference budget
                [people] => 600  //Sum of all conference people
                [rate] => 5000  //Average rate of conference
            )

person Chris    schedule 05.03.2017    source источник
comment
Вы против того, чтобы добавить сюда стороннюю библиотеку? В коллекциях Laravel есть несколько методов, которые помогут в этом.   -  person FatBoyXPC    schedule 06.03.2017
comment
Справедливый вопрос. Если это должно пойти по пути сторонних библиотек, пусть будет так. :) Но это для довольно скромного проекта онлайн-панели, который будет использоваться только несколькими партнерами. Поэтому я хотел бы покупать только виртуальный хостинг, если это возможно, чтобы сэкономить $$. Насколько я понимаю, виртуальный хостинг может быть ограничен в плане того, что вы можете установить. Хм... ты меня озадачил.   -  person Chris    schedule 06.03.2017
comment
@FatBoyXPC, почему вы хотите использовать огромную пушку для простой петли? Любая сторонняя библиотека в этом случае не сделает ее быстрее, если только она не является расширением php в C. Это может сделать ее более легко читаемой, но, конечно, не более эффективной.   -  person Zefiryn    schedule 06.03.2017
comment
Я бы не назвал это огромной пушкой. Именно поэтому я и спросил, а не прямо предложил.   -  person FatBoyXPC    schedule 06.03.2017


Ответы (1)


Пытаться

 $sum = array_reduce($data, function ($a, $b) {
     if (!isset($a[$b['event']])) {
          $a[$b['event']] = $b;
     } else {
         $a[$b['event']]['budget'] += $b['budget'];
         $a[$b['event']]['people'] += $b['people'];
         $a[$b['event']]['rate'] += $b['rate'];
     }
 return $a; });

Для средних вы можете попробовать:

 $sum = array_reduce($data, function ($a, $b) {
     if (!isset($a[$b['event']])) {
          $a[$b['event']] = $b;
          $a[$b['event']]['rate_count'] = 1;
          $a[$b['event']]['average_rate'] = array($b['rate']);
     } else {
         $a[$b['event']]['budget'] += $b['budget'];
         $a[$b['event']]['people'] += $b['people'];
         $a[$b['event']]['rate'] += $b['rate'];
         $a[$b['event']]['rate_count'] += 1;
         $a[$b['event']]['average_rate'] = $a[$b['event']]['rate'] / $a[$b['event']]['rate_count'];
     }
 return $a; });
person Zefiryn    schedule 05.03.2017
comment
Прохладный. Спасибо! Это идеально подходит для получения всех сумм (мне пришлось добавить точки с запятой в конце строк 6 и 7). Любая идея, как получить среднее значение для «скорости» вместо суммы? Я понимаю, что это, вероятно, немного больше связано с процессом. - person Chris; 06.03.2017
comment
Спасибо, что остаетесь со мной в этом. Я так благодарен. Новый код отлично подходит для получения «rate_count» - для конференции он показывает 3. Но хотя среднее значение для «конференции» должно быть 6000, оно отображается как 3000. 3000 + 6000 + 9000 = 18000 18000 / 3 = 6000 Я попытался добавить код чтобы получить желаемый результат, но я не совсем там. Знаете, чего может не хватать? Еще раз спасибо Зефирин за все до сих пор. - person Chris; 06.03.2017
comment
Извините моя ошибка. Проверьте сейчас с $a[$b['event']]['average_rate'] = $a[$b['event']]['rate'] / $a[$b['event']]['rate_count']; - person Zefiryn; 06.03.2017
comment
Удивительно. Это работает как шарм. Спасибо Спасибо! - person Chris; 06.03.2017