Как объединить эти JSON по значению?

164
25 декабря 2021, 14:50

Есть такой items.json:

[
  {
    "name": "Fluted Guard of the Moon Rider",
    "icon": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcU_oAlcQk2fVOiSxMfcRlFwIBYYpbaaOA9vxv_MdC8M7tq0xoaOzvb2Z7iJxD8GsJIi0--Up9Sh0A2yr0pvZ22iJdXGdVQ5NUaQpAZGHIGG2g"
  },
  {
    "name": "Lion Quiver of the Moon Rider",
    "icon": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcU_oAlcQk2fVOiSxtraRVhmahdbiauwIhFlwb2aImoS7oWwzIPYwqetYeKExm9SsMAg3b7AoNz32QDkqUNtMD2lJdPGbEZgNjYx8IO6"
  },
  {
    "name": "Bow of the Moon Rider",
    "icon": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcU_oAlcQk2fVOiS1cDEHE54GgZYofT2e1cwgKWRc2pB74SyzNbYwfamZL6BwjgF65wn3eyRp96sjVbg_xFofSmtc2nZXSY6"
  }
]

И вот такой price.json:

{
    "data": [
        {
          "updated_at": 1576048969000,
          "prices": {
            "last": 5300
          },
          "name": "Lion Quiver of the Moon Rider"
        },
        {
          "updated_at": 1576048969000,
          "prices": {
            "last": 2000.12
          },
          "name": "Dragon Sheild"
        }
    ]
}

Как мне сопоставить цены из price.json по названию предмета? Чтоб получилось вот так:

{
    "name": "Lion Quiver of the Moon Rider",
    "icon": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcU_oAlcQk2fVOiSxtraRVhmahdbiauwIhFlwb2aImoS7oWwzIPYwqetYeKExm9SsMAg3b7AoNz32QDkqUNtMD2lJdPGbEZgNjYx8IO6",
   "price":5300
  }

Пробовал делать вот так, но в результате дубликаты предметов и на которых нет цены удаляются:

<?php
$jsonProducts = '[
  {
    "name": "Fluted Guard of the Moon Rider",
    "icon": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcU_oAlcQk2fVOiSxMfcRlFwIBYYpbaaOA9vxv_MdC8M7tq0xoaOzvb2Z7iJxD8GsJIi0--Up9Sh0A2yr0pvZ22iJdXGdVQ5NUaQpAZGHIGG2g"
  },
  {
    "name": "Lion Quiver of the Moon Rider",
    "icon": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcU_oAlcQk2fVOiSxtraRVhmahdbiauwIhFlwb2aImoS7oWwzIPYwqetYeKExm9SsMAg3b7AoNz32QDkqUNtMD2lJdPGbEZgNjYx8IO6"
  },
  {
    "name": "Lion Quiver of the Moon Rider",
    "icon": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcU_oAlcQk2fVOiSxtraRVhmahdbiauwIhFlwb2aImoS7oWwzIPYwqetYeKExm9SsMAg3b7AoNz32QDkqUNtMD2lJdPGbEZgNjYx8IO6"
  }
  ]';
$jsonData = '{
    "data": [
        {
          "updated_at": 1576048969000,
          "prices": {
            "last": 5300
          },
          "name": "Lion Quiver of the Moon Rider"
        },
        {
          "updated_at": 1576048969000,
          "prices": {
            "last": 2000.12
          },
          "name": "T-shirts"
        }
    ]
}';
$data = json_decode($jsonData, true)['data'];
$products = array_column(json_decode($jsonProducts, true), null, 'name');
$result = array_map(function($item) use ($products) {
    $product              = new \stdClass();
    $product->market_name = $products[$item['name']]['name'];
    $product->size        = $products[$item['name']]['size'];
    $product->price       = $item['prices']['last'] ?? null;
    return $product;
}, $data);
$resultJson = json_encode($result);
var_dump($resultJson);
Answer 1

Если я правильно понял, то можно сделать следующим образом:

$price = json_decode($jsonData, 1)['data'];
$json = json_decode($jsonProducts, 1);
foreach($price as $key => $value)
{
    foreach($json as $k => $value2) {
        if ($value['name'] === $value2['name']) {
            $json[$k]['price'] = $value['prices']['last'];
        }
    }
}
print_r($json);

https://3v4l.org/mWaIS

Если же вы хотите сделать price только для первого найденого вхождения (если рассматривать дубликаты), то можете сделать так:

$bool = false;
foreach($price as $key => $value)
{
    foreach($json as $k => $value2) {
        if ($value['name'] === $value2['name']) {
            if ($bool !== true) {
                $json[$k]['price'] = $value['prices']['last'];
                $bool = true;
            }
        }
    }
}

https://3v4l.org/X7FoM

Answer 2
<?php
$main='{"data1":[
  {
    "name": "Fluted Guard of the Moon Rider",
    "icon": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcU_oAlcQk2fVOiSxMfcRlFwIBYYpbaaOA9vxv_MdC8M7tq0xoaOzvb2Z7iJxD8GsJIi0--Up9Sh0A2yr0pvZ22iJdXGdVQ5NUaQpAZGHIGG2g"
  },
  {
    "name": "Lion Quiver of the Moon Rider",
    "icon": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcU_oAlcQk2fVOiSxtraRVhmahdbiauwIhFlwb2aImoS7oWwzIPYwqetYeKExm9SsMAg3b7AoNz32QDkqUNtMD2lJdPGbEZgNjYx8IO6"
  },
  {
    "name": "Bow of the Moon Rider",
    "icon": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KW1Zwwo4NUX4oFJZEHLbXK9QlSPcU_oAlcQk2fVOiS1cDEHE54GgZYofT2e1cwgKWRc2pB74SyzNbYwfamZL6BwjgF65wn3eyRp96sjVbg_xFofSmtc2nZXSY6"
  }
]
}';
 $go='{
    "data": [
        {
          "updated_at": 1576048969000,
          "prices": {
            "last": 5300
          },
          "name": "Lion Quiver of the Moon Rider"
        },
        {
          "updated_at": 1576048969000,
          "prices": {
            "last": 2000.12
          },
          "name": "Dragon Sheild"
        }
    ]
}';
$result=json_decode($main,true);
//print_r($result);
$result1=json_decode($go,true);
foreach ($result as $key => $value) {
foreach ($value as $key1 => $value1) {
    foreach ($result1 as $key0 => $value0) {
foreach ($value0 as $key10 => $value10) {
if($value1['name']==$value10['name']){
    $arr['price']=$value10['prices']['last'];
    $arr['icon']=$value1['icon'];
    $arr['name']=$value1['name'];
}
}
}
}
}
print_r($arr);
READ ALSO
Php как отправить CORS запрос?

Php как отправить CORS запрос?

PHP может отправлять запросы на подобие этого:

198
Есть input куда пользователь может ввести число больше нуля

Есть input куда пользователь может ввести число больше нуля

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

101
как прочитать значение value в input ( JQuery NO )

как прочитать значение value в input ( JQuery NO )

HELLO Имеется несколько вариантов ответа , по нажатию на кнопку нужно проверить , если value== a , ответ правильный , если b , неверный

84