Несколько массивов с одинаковым значением ключа объединяются в массив

У меня проблема с вычислением нескольких массивов. Я использую базу данных MySQL, и язык работы — PHP. Когда я выбираю результат из базы данных, результат показывает несколько массивов с фиксированным ключом и значением. Если одно значение кода ключа массива совпадает со значением кода ключа отдельного массива, тогда этот массив объединяется с одним с суммой количеств и цен. Это получение результата из базы данных.

['code'=>'aaa','name'=>'a','qty'=>20,'price'=>12.00],
['code'=>'bbb','name'=>'b','qty'=>20,'price'=>12.00],
['code'=>'ccc','name'=>'c','qty'=>20,'price'=>12.00],
['code'=>'aaa','name'=>'a','qty'=>20,'price'=>12.00],
['code'=>'ddd','name'=>'d','qty'=>20,'price'=>12.00],
['code'=>'ccc','name'=>'c','qty'=>5,'price'=>8.00],
['code'=>'bbb','name'=>'b','qty'=>15,'price'=>10.00],
['code'=>'ggg','name'=>'g','qty'=>20,'price'=>12.00],

и я хочу настроить этот результат в этом формате.

['code'=>'aaa','name'=>'a','qty'=>40,'price'=>24.00],
['code'=>'bbb','name'=>'b','qty'=>35,'price'=>22.00],
['code'=>'ccc','name'=>'c','qty'=>25,'price'=>20.00],
['code'=>'ddd','name'=>'d','qty'=>20,'price'=>12.00],
['code'=>'ggg','name'=>'g','qty'=>20,'price'=>12.00],

Пожалуйста, помогите мне решить эту проблему. Я много пробовал, но не получил никакого решения.

-2

Решение

Ты можешь использовать array_reduce чтобы дать вам результат, который вы хотите. Анонимный обратный вызов проверяет, существует ли код из текущего значения в массиве результатов, и, если это так, суммирует текущее количество и цену. Если это не так, текущее значение помещается в массив результатов. Код инициализирует результат с первым значением в исходном массиве, поэтому нам не нужно беспокоиться о неопределенных индексах:

$newdata = array_reduce(array_slice($data, 1),
function ($c, $v) {
if (($k = array_search($v['code'], array_column($c, 'code'))) !== false) {
$c[$k]['qty'] += $v['qty'];
$c[$k]['price'] += $v['price'];
}
else {
$c[] = $v;
}
return $c;
}, array($data[0]));
print_r($newdata);

Выход:

Array (
[0] => Array ( [code] => aaa [name] => a [qty] => 40 [price] => 24 )
[1] => Array ( [code] => bbb [name] => b [qty] => 35 [price] => 22 )
[2] => Array ( [code] => ccc [name] => c [qty] => 25 [price] => 20 )
[3] => Array ( [code] => ddd [name] => d [qty] => 20 [price] => 12 )
[4] => Array ( [code] => ggg [name] => g [qty] => 20 [price] => 12 )
)

Демо на 3v4l.org

3

Другие решения

Вы можете достичь с помощью одного размерного массива …

$newArray = array();   //create new array..

foreach($array as $item) {
if(isset($newArray[$item['code']])) { //if already exist then sum of qty and price...
$newArray[$item['code']]['qty'] += $newArray[$item['code']]['qty'];
$newArray[$item['code']]['price'] += $newArray[$item['code']]['price'];
}else {   //if first time then add array into them...
$newArray[$item['code']] = $item;
}
}

с помощью запроса вы можете сделать это

SELECT code, name, SUM(qty), SUM(price)
from tableName
group by code
2

SELECT code, name, SUM(qty), price
from your_table_name
group by name

используйте group by при получении результата, так как вы используете mysql. Надеюсь, это поможет.

0

Попробуй это

    <?php

error_reporting(0);
$array=array(['code'=>'aaa','name'=>'a','qty'=>20,'price'=>12.00],
['code'=>'bbb','name'=>'b','qty'=>20,'price'=>12.00],
['code'=>'ccc','name'=>'c','qty'=>20,'price'=>12.00],
['code'=>'aaa','name'=>'a','qty'=>20,'price'=>12.00],
['code'=>'ddd','name'=>'d','qty'=>20,'price'=>12.00],
['code'=>'ccc','name'=>'c','qty'=>5,'price'=>8.00],
['code'=>'bbb','name'=>'b','qty'=>15,'price'=>10.00],
['code'=>'ggg','name'=>'g','qty'=>20,'price'=>12.00]);


foreach($array as $item) {
$newArray[$item['code']]['code'] = $item['code'];
$newArray[$item['code']]['name'] = $item['name'];
$newArray[$item['code']]['qty'] += $item['qty'];
$newArray[$item['code']]['price'] +=$item['price'];
}
$newArray=array_values($newArray);

print_r($newArray);

?>
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector