у меня есть этот оригинальный массив в моем коде
[
{
"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
},
]
}
]
Если вам нужно только суммировать счет, когда имена совпадают, вам просто нужно перебрать каждый пункт назначения в каждом массиве, а когда вы найдете повторяющееся имя, просто добавьте счет к предыдущему значению. Это даст вам новый массив с желаемым выводом:
$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
}
}
}
]
Я рекомендую разделить задачу на небольшие части, которые вы сможете лучше понять, а затем перейти к целому.
Я помогу вам с внутренним массивом, самой простой задачей, и вы увидите, как все станет более понятным оттуда.
Так что, если вы получите эту коллекцию 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.