как найти и вытащить новые добавленные объекты в json на PHP?
json1
{
"status": "ok",
"data": {
"accountid": [
{
"all": {
"wins": 7,
"losses": 1,
"battles": 8
},
"id": 5
},
{
"all": {
"wins": 7,
"losses": 1,
"battles": 8
},
"id": 15
},
{
"all": {
"wins": 7,
"losses": 1,
"battles": 8
},
"id": 18
}
]
}
}
Json2
{
"status": "ok",
"data": {
"accountid": [
{
"all": {
"wins": 7,
"losses": 1,
"battles": 8
},
"id": 5
},
{
"all": {
"wins": 7,
"losses": 1,
"battles": 8
},
"id": 8
},
{
"all": {
"wins": 7,
"losses": 1,
"battles": 8
},
"id": 11
},
{
"all": {
"wins": 7,
"losses": 1,
"battles": 8
},
"id": 15
},
{
"all": {
"wins": 7,
"losses": 1,
"battles": 8
},
"id": 18
}
]
}
}
Во втором json файле добавились новые объекты в массив, номера id всегда рандомные, в данном случае, именно id 8 и 11 со значениями в [all]. Именно эти значения и нужно вытащить. Как найти решение?
должно получиться так: Изменения между 1 и 2 json - добавлены id 8 и id 11.
В предыдущем моем вопросе я написал код (Сравнение двух json php и запись в третий), но он работает, только когда 2 разных json идентичны по ид.
Если возможно, подскажите пожалуйста как это сделать.
Ответы (2 шт):
PHP:
$json1 = '{"status": "ok", "data": {"accountid": [{"all": {"wins": 7, "losses": 1, "battles": 8 }, "id": 5 }, { "all": { "wins": 7, "losses": 1, "battles": 8 }, "id": 15 }, { "all": { "wins": 7, "losses": 1, "battles": 8 }, "id": 18 }]}}';
$json2 = '{"status": "ok", "data": {"accountid": [{"all": {"wins": 7, "losses": 1, "battles": 8 }, "id": 5 }, { "all": { "wins": 7, "losses": 1, "battles": 8 }, "id": 8 }, { "all": { "wins": 7, "losses": 1, "battles": 8 }, "id": 11 }, { "all": { "wins": 7, "losses": 1, "battles": 8 }, "id": 15 }, { "all": { "wins": 7, "losses": 1, "battles": 8 }, "id": 18 }]}}';
$arr1 = json_decode($json1,true); // переводим первый и второй json в массивы
$arr2 = json_decode($json2,true);
$existIDs = array(); // пустой массив для создания списка существующих в первом массиве ID
foreach ($arr1["data"]["accountid"] as $exist) {
$existIDs[] = $exist['id']; // записываем все ID из первого json в массив
}
foreach ($arr2["data"]["accountid"] as $key => $toremove) { // проводим цикл по второму массиву
if (in_array($toremove['id'],$existIDs)) { // проверяем, существует ли во втором массиве элемент с ID, существующим в первом массиве
echo "Уничтожаем элемент с ID: ".$toremove['id']." (порядковый номер: ".$key.")".PHP_EOL; // комментарии для отладки, при релизе уберите
unset($arr2["data"]["accountid"][$key]); // если существует, удаляем этот элемент из второго массива
}
}
echo PHP_EOL."ID оставшихся элементов:".PHP_EOL;
foreach($arr2["data"]["accountid"] as $arr) {
echo "- ".$arr['id'].PHP_EOL;
}
echo PHP_EOL."Структура массива без повторяющихся элементов:".PHP_EOL;
print_r($arr2);
Вывод:
Уничтожаем элемент с ID: 5 (порядковый номер: 0)
Уничтожаем элемент с ID: 15 (порядковый номер: 3)
Уничтожаем элемент с ID: 18 (порядковый номер: 4)
ID оставшихся элементов:
- 8
- 11
Структура массива без повторяющихся элементов:
Array (
[status] => ok
[data] => Array (
[accountid] => Array (
[1] => Array (
[all] => Array (
[wins] => 7
[losses] => 1
[battles] => 8
) // End of [all]
[id] => 8
) // End of [1]
[2] => Array (
[all] => Array (
[wins] => 7
[losses] => 1
[battles] => 8
) // End of [all]
[id] => 11
) // End of [2]
) // End of [accountid]
) // End of [data]
) // End
Спасибо Dmitry за помощь, я нашел свое решение, выкладываю код ниже. Я не пониманию людей, которые мне минусы поставили, вместо того, чтобы написать комментарий как и где искать зацепку, но и им спасибо, ведь они мотивировали меня до последнего самому найти решение.
$jsonnum = json_decode(file_get_contents('1.json'), true);
$jsonnum1 = json_decode(file_get_contents('2.json'), true);
foreach ($jsonnum['data']['accountid'] as $k => $v)
{
foreach ($jsonnum1['data']['accountid'] as $k1 => $v1)
{
$part[$k] = $v['id'];
$part1[$k1] = $v1['id'];
}
}
$missed = array_diff(array_values($part1), $part);
print_r($missed);