Как в json файле проверить и сравнить значение параметра по id?

Получаю данные из rss ленты в ajax.

<p><a href="https://site.ru" target="_blank">test 1</a> <check>47534</check></p>
<p><a href="https://site.ru" target="_blank">test 2</a> <check>4534</check></p>
<p><a href="https://site.ru" target="_blank">test 3</a> <check>45364</check></p>
<p><a href="https://site.ru" target="_blank">test 4</a> <check>4534</check></p>
<p><a href="https://site.ru" target="_blank">test 5</a> <check>7373</check></p>

Мне необходимо на лету обработать их и на ajax создать эффект в случае изменения в данных ленты.

Чтобы понять изменились данные или нет, сначала записываю их в JSON файл, id и check (check может изменяться).

[{"id":{"0":"123456"},"check":{"0":"3490"}},{"id":{"0":"678912"},"check":{"0":"1790"}}]

Далее при обновлении ajax нужно проверить массив с $id на сохраненные в json $id и $check, если $check изменился, прописать класс для данной строки. Если id нет в json базе, то записать его для последующего сравнения.

ajax.php

$url = "https://site.ru/cached-index.xml";
$content = file_get_contents($url);
$items = new SimpleXmlElement($content);

// запись файла
$json = json_decode(file_get_contents('data.json'), true);

$json[] = [
  'id' => $item->id,
  'check' => $item->check
];


foreach($items -> channel -> item as $item) {

print '<p><a href="' . $item->link . '" target="_blank">' . $item->title . '</a> <check>' . $item->check . '</check></p>';

}  

file_put_contents('data.json', json_encode($json));

$a = полученный check;
$aa = check из json;

$response = ($a != $aa);

if($response === true){
echo 'здесь нужно прописать класс, значение изменилось!';
}else{
echo 'без изменений';
} 

Страница

<div id="ajax"></div>
<script type="text/javascript">
    function show()  
    {  
        $.ajax({  
            url: "ajax.php",  
            cache: false,  
            success: function(html){  
                $("#ajax").html(html);  
                $('.box').first().addClass('animate__animated animate__bounce');
            }  
        });  
    }  
  
    $(document).ready(function(){  
        show();  
        setInterval('show()',1000);  
    });  
</script>

Как проверить check по id и в случае изменений прописать для данной строки <p class="box">?

json такой

[{"id":{"0":"123456"},"check":{"0":"3490"}},{"id":{"0":"678912"},"check":{"0":"1790"}}]

Как сохранить данные если id из массива еще нет в json?

Что-то запутался совсем, данные постоянно сохраняются в json. Как корректно записать и проверить данные?

Возможно js позволяет делать это без дополнительных манипуляций с сохранением значений check перед ajax обновлением?


Ответы (1 шт):

Автор решения: Максим Степанов

Насколько я понял задачу, серверная часть должна просто отдавать обновленные записи, если они есть. То есть получается три этапа:

  1. Получить текущие данные rss
  2. Обновить файл в бд - дописать обновленные записи, если есть.
  3. отдать браузеру список обновленных записей.

Как-то так, получается:

// как-то получаем rss
$url = "https://site.ru/cached-index.xml";
$content = file_get_contents($url);
$items = new SimpleXmlElement($content);

// читаем из файла или, если файла еще нет, создаем пустой массив для хранения rss в json-базе
$saved_data_path = '/path/to/json';
$saved_data = (file_exists($saved_data_path)) ? json_decode(file_get_contents($url), true) : array();

// создадим массив для хранения новых записей rss
$new_rss_records = array();

// смотрим все записи rss. 
foreach($items->channel->item as $item) {
    if(!array_key_exists($item->id, $saved_data) || $saved_data[$item->id]['check'] != $item->check){
        // Если какой-то записи нет в $saved_data или обновлено значение 'check', запишем ее
        $saved_data[$item->id] = (array) $item;
        // и сохраним для ответа 
        $new_rss_records[$item->id] = $saved_data[$item->id];
    }
}

// если есть новые записи, сохраняем $saved_data
if(!empty($new_rss_records)){
    file_put_contents($saved_data_path, json_encode($saved_data));
}

// отдаем json с новыми записями
echo json_encode($new_rss_records);

А в js принимать json и уже выводить в виде ссылок

$.ajax({
    url: 'ajax.php',
    dataType: 'json',
    cache: false,
    success: function(jsonData){
        for(var rss_id in jsonData){
            // получаем элемент с текущим атрибутом rss_id
            let item = $('#ajax a[rss_id='+rss_id+']');
            
            if(item[0]){
                // если есть, обновляем его класс
                $(item).addClass('animate__animated animate__bounce');
            } else {
                // если нет, создаем новый элемент и добавляем к ('#ajax')
                $('<a>', {
                    rss_id: rss_id,
                    href: 'https://site.ru', 
                    target: '_blank',
                    text: 'test 2',
                    check: jsonData[rss_id]['check']
                }).appendTo('#ajax');
            }
        }
    }
});
→ Ссылка