Сложить одинаковые значения в сумму и показать их количество

Рейтинг: 0Ответов: 2Опубликовано: 19.03.2023

Есть такой массив данных:

$place = 

Array
(
    [p] => 1100
    [t] => Бельэтаж
    [i] => 23:24
    [r] => 2
    [n] => 21
)
1
Array
(
    [p] => 1100
    [t] => Бельэтаж
    [i] => 23:26
    [r] => 2
    [n] => 23
)
1
Array
(
    [p] => 800
    [t] => Балкон
    [i] => 27:19
    [r] => 2
    [n] => 16
)
1
Array
(
    [p] => 1500
    [t] => Партер
    [i] => 2:14
    [r] => 2
    [n] => 6
)

Нужно сложить одинаковые значения [p] и показать их сумму. Примерно чтобы получилось так:

2 шт по 1100 всего 2200
1 шт по 800 всего 800
1 шт по 1500 всего 1500

Пробовал сделать так:

$placeCost = $place['p'];   //стоимость
$orders_sum += $placeCost;
//находим индекс в массиве цен на места
$key = array_search($placeCost, $simplePrices);
//прибавляем оплату
$simplePricesSum[$key] += $placeCost;

Но, ничего не получилось, получил только кучу ошибок, хотя по итогу потом что то да сложилось у меня, но не так как надо ...

Ответы

▲ 1Принят

Можно сделать новый массив, где будут храниться значения суммы цен для каждого уникального значения $place['p'] и использовать цикл foreach чтобы вычислить стоимость и проверить, есть ли уже такая стоимость в массиве $totals. Если есть, то мы увеличиваем количество мест и добавляем стоимость к общей сумме, в противном случае мы создаем новый элемент в массиве $totals и записываем туда количество мест и стоимость

$places = [
    [
        'p' => 1100,
        't' => 'Бельэтаж',
        'i' => '23:24',
        'r' => 2,
        'n' => 21,
    ],
    [
        'p' => 1100,
        't' => 'Бельэтаж',
        'i' => '23:26',
        'r' => 2,
        'n' => 23,
    ],
    [
        'p' => 800,
        't' => 'Балкон',
        'i' => '27:19',
        'r' => 2,
        'n' => 16,
    ],
    [
        'p' => 1500,
        't' => 'Партер',
        'i' => '2:14',
        'r' => 2,
        'n' => 6,
    ],
];

$totals = [];

foreach ($places as $place) {
    $price = $place['p'];

    if (isset($totals[$price])) {
        $totals[$price]['count']++;
        $totals[$price]['total'] += $price;
    } else {
        $totals[$price] = [
            'count' => 1,
            'total' => $price,
        ];
    }
}

foreach ($totals as $price => $data) {
    echo "{$data['count']} шт по $price всего {$data['total']}\n";
}
▲ 1

Я бы сократил историю с массивом количества разных цен:

<?php
$places = [
    [
    'p' => 1100,
        't' => 'Бельэтаж',
        'i' => '23:24',
        'r' => 2,
        'n' => 21,
    ],
    [
        'p' => 1100,
        't' => 'Бельэтаж',
        'i' => '23:26',
        'r' => 2,
        'n' => 23,
    ],
    [
        'p' => 800,
        't' => 'Балкон',
        'i' => '27:19',
        'r' => 2,
        'n' => 16,
    ],
    [
        'p' => 1500,
        't' => 'Партер',
        'i' => '2:14',
        'r' => 2,
        'n' => 6,
    ],
];

$prices = array_column($places, 'p'); // массив из значений одного столбца входного массива
$res = [];
foreach($prices as $price) {
    if (isset($res[$price])) {
        $res[$price]++;
    } else {
        $res[$price] = 1;
    }
}

foreach($res as $price => $count) {
    echo "{$count} шт по {$price} всего ". ($price*$count) . PHP_EOL;
}