Как в 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 шт):
Насколько я понял задачу, серверная часть должна просто отдавать обновленные записи, если они есть. То есть получается три этапа:
- Получить текущие данные rss
- Обновить файл в бд - дописать обновленные записи, если есть.
- отдать браузеру список обновленных записей.
Как-то так, получается:
// как-то получаем 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');
}
}
}
});