Объединить массивы которые повторяются и добавить их в новый массив

у меня есть массив типа этого:

Array
(

    [0] => Array
        (
            [id] => 1
            [user-id] => 1
            [number-lessons] => 1
            [likes] => 190
            [dislikes] => 12
        )

    [1] => Array
        (
            [id] => 3
            [user-id] => 1
            [number-lessons] => 1
            [likes] => 100
            [dislikes] => 43
        )

    [2] => Array
        (
            [id] => 2
            [user-id] => 2
            [number-lessons] => 1
            [likes] => 143
            [dislikes] => 13
        )
     [3] => Array
        (
            [id] => 4
            [user-id] => 2
            [number-lessons] => 5
            [likes] => 180
            [dislikes] => 45
        )

)

И мне нужно объединить повторяющие в ключе "user-id" и прибавить number-lessons к другим повторяющимся массивам, лайки и дизлайки то же так. спасибо за ранее

Результат этого примерного массива должен быть примерно таким.

Array
(

 [0] => Array
        (
            [user-id] => 1
            [number-lessons] => 2
            [likes] => 290
            [dislikes] => 55
        )

 [1] => Array
        (
            [user-id] => 2
            [number-lessons] => 6
            [likes] => 323
            [dislikes] => 58
        )
)

Ответы (3 шт):

Автор решения: Александр Лопатин
$arr = [];
$arr[0] = ['id' => 1, 'user_id' => 1, 'number_lessons' => 1, 'likes' => 190, 'dislikes' => 12];
$arr[1] = ['id' => 3, 'user_id' => 1, 'number_lessons' => 1, 'likes' => 100, 'dislikes' => 43];
$arr[2] = ['id' => 2, 'user_id' => 2, 'number_lessons' => 1, 'likes' => 143, 'dislikes' => 13];
$arr[3] = ['id' => 4, 'user_id' => 2, 'number_lessons' => 5, 'likes' => 180, 'dislikes' => 45];

$new_arr = [];
foreach ($arr as $key => $item) {
    if ($item['user_id'] == $arr[$key]['user_id']) {
        $new_arr[$item['user_id']][] = $item;
    }
}
foreach ($new_arr as $key => $item) {
    if (is_array($item)) {
        $final_arr[$key]['user_id'] = 0;
        $final_arr[$key]['number_lessons'] = 0;
        $final_arr[$key]['likes'] = 0;
        $final_arr[$key]['dislikes'] = 0;
        foreach ($item as $in_item) {
            if (isset($in_item['number_lessons'])) {
                $final_arr[$key]['user_id'] = $in_item['user_id'];
                $final_arr[$key]['number_lessons'] += $in_item['number_lessons'];
                $final_arr[$key]['likes'] += $in_item['likes'];
                $final_arr[$key]['dislikes'] += $in_item['dislikes'];
            }
        }
    }
}
print_r($final_arr);
?>

Мне кажется это подходит

→ Ссылка
Автор решения: teran

возьмем условный массив

группируем по полю uid, суммируем likes, views.

$data = [
    ['uid' => 1, 'likes' => 1, 'views' => 2],
    ['uid' => 1, 'likes' => 2, 'views' => 3],
    ['uid' => 2, 'likes' => 3, 'views' => 4]
];

Для этого заводим результирующий массив, ключами которого будут uid. Если ключа нет, мы копируем текущее значением исходного массива. Если ключ уже есть, то мы суммируем поля.

$result = [];
foreach($data as $d){
    $uid = $d['uid'];
    if(array_key_exists($uid, $result)){
        $result[$uid]['likes'] += $d['likes'];
        $result[$uid]['views'] += $d['views'];
    }
    else $result[$uid] = $d;
}
print_r($result);

Но вообще, поскольку вы пишите про то, что исходный массив получаете из БД, вероятно каким-то запросом вида

 SELECT id, uid, likes, views FROM t

В случае, если вам нужны только суммы, то решите сей вопрос на стороне СУБД

SELECT uid, sum(likes) as likes, sum(views) as views 
FROM t
GROUP BY uid
→ Ссылка
Автор решения: vp_arth
$items = [
    ['user-id' => 1, 'likes' => 1, 'dislikes' => 2],
    ['user-id' => 1, 'likes' => 2, 'dislikes' => 3],
    ['user-id' => 2, 'likes' => 3, 'dislikes' => 4]
];

$res = [];
$init = ['likes' => 0, 'dislikes' => 0];
foreach($items as $item){
    $key = $item['user-id'];
    $res[$key] = $res[$key] ?? $init;
    $res[$key]['likes']    += $item['likes'];
    $res[$key]['dislikes'] += $item['dislikes'];
}

echo json_encode($res);
→ Ссылка