Объединить массивы которые повторяются и добавить их в новый массив
у меня есть массив типа этого:
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);
?>
Мне кажется это подходит
возьмем условный массив
группируем по полю 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
$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);