Получить сумму значений массива

145
07 декабря 2018, 03:30

Есть такой массив:

array ( '18-24' => array ( 0 => 'female/5', 1 => 'male/10', 2 => 'female/20', ), '25-34' => array ( 0 => 'female/50', 1 => 'male/30', 2 => 'female/10', )

Как на выходе получить массив вида:

array ( '18-24' => array ( "female" => '25', "male" => '10'), '25-34' => array ( "female" => '60', "male" => '30' )

То есть чтобы суммировались значения мужчин и женщин.

Вот так вывожу свой текущий массив:

$demograph = array();
foreach ($arrDemo as $valueDemo) {
    $demograph[$valueDemo['vozrast']][] = $valueDemo['pol'].'/'.$valueDemo['col'];
}

Буду благодарен за помощь.

Answer 1

Поправил код, теперь выдает без нотисов, и думаю такой вариант самый простой:

$arr = [
    '18-24' => ['female/5', 'male/10', 'female/20'],
    '25-34' => ['female/50', 'male/30', 'female/10']
];
$new = [];
foreach ($arr as $key => $value)
{
    $new[$key] = [];
    foreach ($value as $k => $v)
    {
        $dc = explode('/', $v);
        if (!isset($new[$key][$dc[0]]))
            $new[$key][$dc[0]] = 0;
        $new[$key][$dc[0]] += $dc[1];  
    }
}
print_r($new);

На выходе получаем:

Array
(
    [18-24] => Array
        (
            [female] => 25
            [male] => 10
        )
    [25-34] => Array
        (
            [female] => 60
            [male] => 30
        )
)
Answer 2

Поскольку представленный вами массив вы таки генерируете и он не особо удобен для обработки, то вернемся к исходным данным (я несколько переименовал ключи):

$valueDemo = [
    [ 'age'=> '18-24', 'sex' => 'female', 'qnt' => 5],
    [ 'age'=> '18-24', 'sex' => 'male',   'qnt' => 10],
    [ 'age'=> '18-24', 'sex' => 'female', 'qnt' => 20],
    [ 'age'=> '25-34', 'sex' => 'female', 'qnt' => 50],
    [ 'age'=> '25-34', 'sex' => 'male',   'qnt' => 30],
    [ 'age'=> '25-34', 'sex' => 'female', 'qnt' => 10],
] ;

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

$data = array_fill_keys(array_unique(array_column($valueDemo, 'age')), ['male' => 0, 'female' => 0]);

Начальными значениями будет пары ['male' => 0, 'female' => 0]

И осталось пройти по исходному массиву и просуммировать данные:

array_walk($valueDemo, function($v) use (&$data){
    $data[ $v['age'] ][ $v['sex'] ] += $v['qnt'];
});
Answer 3

Примерно так я бы решал проблему:

$demograph = [];
foreach ($arrDemo as $valueDemo) {
    $demograph[$valueDemo['vozrast']][$valueDemo['pol']] += $valueDemo['col'];
}

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

На выходе будет что-то типа:

[
    '18-24' => ['male' => 10, 'female' => 25],
    '25-34' => ...
]
READ ALSO
Call to a member function getImage() on null

Call to a member function getImage() on null

Подскажите пожалуйста где ошибка

201
Как восстановить приложение?

Как восстановить приложение?

Работаю на linux, делаю приложение на yii2-advanced, локальный сервер apache2

162
Как настроить права и роли (области видимости) в Битрикс24?

Как настроить права и роли (области видимости) в Битрикс24?

В настройках прав доступа Битрикс, раздел CRM, есть Пользователь ТЕСТ с ролью Начальник Отдела

134
Создать многомерный массив в цикле

Создать многомерный массив в цикле

Допустим, имеем массив:

177