php: Как объединить и суммировать значения массива с одинаковым значением ключа?

у меня есть этот оригинальный массив в моем коде

 [
{
"source": {
"id": 2,
"name": "Cairo"},
"destination": [
{
"count": 3,
"name": "Alex",
"price": 2000,
"discount": null,
"distance": 12,
"new": false
},
{
"count": 4,
"name": "Alex",
"price": 2000,
"discount": null,
"distance": 12,
"new": false
}
]
},
{
"source": {
"id": 1,
"name": "Zagazig"},
"destination": [
{
"count": 1,
"name": "Alex",
"price": 200,
"discount": null,
"distance": 100,
"new": false
},
{
"count": 1,
"name": "Cairo",
"price": 1000,
"discount": null,
"distance": 100,
"new": false
},
{
"count": 1,
"name": "Cairo",
"price": 1000,
"discount": null,
"distance": 100,
"new": false
}
]
}
]

в массиве назначения, если имя повторяется в каждом объекте, таком как alex или cairo, я хочу объединить его в один объект, иметь только один объект с именем cairo и один объект с именем alex и вычислить или суммировать ключ счета

я хочу этот результат ……………. …………….

     [
{
"source": {
"id": 2,
"name": "Cairo"},
"destination": [
{
"count": 7,
"name": "Alex",
"price": 2000,
"discount": null,
"distance": 12,
"new": false
}
]
},
{
"source": {
"id": 1,
"name": "Zagazig"},
"destination": [
{
"count": 1,
"name": "Alex",
"price": 200,
"discount": null,
"distance": 100,
"new": false
},
{
"count": 2,
"name": "Cairo",
"price": 1000,
"discount": null,
"distance": 100,
"new": false
},
]
}
]

-2

Решение

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

$a =  [
array(
"source" => array(
"id" => 2,
"name" => "Cairo"),
"destination" => [
array(
"count" => 3,
"name" => "Alex",
"price" => 2000,
"discount" => null,
"distance" => 12,
"new" => false
),
array(
"count" => 4,
"name" => "Alex",
"price" => 2000,
"discount" => null,
"distance" => 12,
"new" => false
)
]
),
array(
"source" =>  array(
"id" => 1,
"name" => "Zagazig"),
"destination" => [
array(
"count" => 1,
"name" => "Alex",
"price" => 200,
"discount" => null,
"distance" => 100,
"new" => false
),
array(
"count" => 1,
"name" => "Cairo",
"price" => 1000,
"discount" => null,
"distance" => 100,
"new" => false
),
array(
"count" => 1,
"name" => "Cairo",
"price" => 1000,
"discount" => null,
"distance" => 100,
"new" => false
)
]
)
];

$new_array = array();
foreach ($a as $e)  {
$tmp = array();
foreach ($e['destination'] as $d) {
if (isset($tmp[$d['name']])) {
$tmp[$d['name']]['count'] += $d['count'];
} else {
$tmp[$d['name']] = $d;
}
}
array_push($new_array,  array(
'source' => $e['source'],
'destination' => $tmp
));
}
echo json_encode($new_array);

Выход:

[
{
"source":{
"id":2,
"name":"Cairo"},
"destination":{
"Alex":{
"count":7,
"name":"Alex",
"price":2000,
"discount":null,
"distance":12,
"new":false
}
}
},
{
"source":{
"id":1,
"name":"Zagazig"},
"destination":{
"Alex":{
"count":1,
"name":"Alex",
"price":200,
"discount":null,
"distance":100,
"new":false
},
"Cairo":{
"count":2,
"name":"Cairo",
"price":1000,
"discount":null,
"distance":100,
"new":false
}
}
}
]
0

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

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

Я помогу вам с внутренним массивом, самой простой задачей, и вы увидите, как все станет более понятным оттуда.

Так что, если вы получите эту коллекцию JSON:

$json_easy = '[
{
"count": 1,
"name": "Alex",
"price": 200,
"discount": null,
"distance": 100,
"new": false
},
{
"count": 1,
"name": "Cairo",
"price": 1000,
"discount": null,
"distance": 100,
"new": false
},
{
"count": 1,
"name": "Cairo",
"price": 1000,
"discount": null,
"distance": 100,
"new": false
}
]';

Вы можете декодировать:

$easy_decode = json_decode($json_easy, true);

А затем создайте новый массив:

$new_array = array();

foreach ($easy_decode as $value) {

if(array_key_exists($value['name'],$new_array))
$value['count'] += $new_array[$value['name']]['count'];

$new_array[$value['name']] = $value;
}

var_dump($new_array);

Если вы посмотрите внимательно, то увидите, что теперь вы можете делегировать свою функцию в свой php-код и суммировать любые значения в массиве с любыми критериями, которые вам нравятся. После создания своих функций вы можете начать движение вверх в массиве, используя больше циклов for или foreach.

0

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