Я пытаюсь найти лучший способ найти комбинацию значений в массиве json, и, если она существует, вернуть сообщение об ошибке. Если комбинация значений отсутствует в массиве, отправьте их на сервер. Вот что у меня есть на данный момент.
JSON
[{
"username": "[email protected]",
"contest": "TV",
"timestamp": "Fri Nov 09 2018 16:33:38 GMT-0500 (Eastern Standard Time)"
}, {
"username": "[email protected]",
"contest": "Phone",
"timestamp": "Fri Nov 09 2018 18:33:51 GMT-0500 (Eastern Standard Time)"
}]
Я использую ajax для публикации деталей на php, и эта часть работает хорошо.
$.ajax({
type: 'POST',
url: 'update.php',
data: { theuser: theuser, thecontest: thecontest, timestamp: timestamp },
success: function() {
//Show confirm notification hide btns and close the modal
$('.modalbtns').hide();
$('#successbox').fadeIn();
setTimeout(function() {
$('#ModalCenter').modal('hide')
}, 2400);
},
error: function() {
// do something on error
}
});
Это то, что у меня есть для php (update.php)
<?php
$theuser = $_POST['theuser'];
$thecontest = $_POST['thecontest'];
$timestamp = $_POST['timestamp'];
if (is_writable('alldata.json')) {
$json = file_get_contents('alldata.json');
$data = json_decode($json);
$data[] = array('username'=> $theuser, 'contest' => $thecontest, 'timestamp' => $timestamp);
file_put_contents('alldata.json', json_encode($data));
} else {
//echo "file is not writable, check permissions";
}
?>
Например, я пытаюсь достичь
Перед публикацией проверьте в массиве json, существует ли следующая комбинация. имя пользователя = [email protected] И конкурс = Телефон Если он существует, верните на страницу настраиваемое сообщение, например (вы уже зарегистрировались). Если комбинации нет в массиве json, опубликуйте в файл.
Я считаю, что это должно быть что-то вроде
foreach($data as $item)
{
if ($item->username == $username) || ($item->contest == $contest){
//combination found, do not post!
}
}
Но не могу заставить его работать, спасибо за помощь!






Вы должны изменить внутренний PHP-код следующим образом:
<?php
$theuser = $_POST['theuser'];
$thecontest = $_POST['thecontest'];
$timestamp = $_POST['timestamp'];
if (is_writable('alldata.json')) {
$json = file_get_contents('alldata.json');
$data = json_decode($json, true);
$flag = false;
foreach($data as $d){
if ($d['username'] == $theuser && $d['contest'] == $thecontest){
$flag = true;
break;
}
}
if (!$flag){
$data[] = array('username'=> $theuser, 'contest' => $thecontest, 'timestamp' => $timestamp);
file_put_contents('alldata.json', json_encode($data));
}else{
// echo "you are already registered for the contest";
}
} else {
// echo "file is not writable, check permissions";
}
?>
Сводка необходимых изменений:
true функции json_decode(), чтобы преобразовать возвращаемые объекты в ассоциативные массивы.&& вместо ||, чтобы проверить, зарегистрирован ли пользователь уже для конкретного конкурса или нет.$flag и цикл foreach, чтобы проверить, зарегистрирован ли пользователь уже, отобразить простое сообщение, если он уже зарегистрирован, или прикрепить данные пользователя к строке json, если он не зарегистрирован.Спасибо, это работает! Как я могу отправить строку «вы уже зарегистрированы» обратно в ajax?
@ Carlos27, ваша функция обратного вызова success AJAX будет выглядеть примерно так: success: function(data){alert(data);}, где data - это данные, возвращенные сервером, то есть ваш оператор echo.
Вы можете просто создать функцию для этой проверки и использовать свой код цикла:
<?php
function check_combination($data){
foreach($data as $item)
{
if ($item->username == $username) || ($item->contest == $contest){
return false; //if match found function will return by breaking the loop.
}
}
return true; //it will be returned after all the values are iterated.
}
check_combination($data);
Но обратите внимание, что если ваши данные слишком велики, это может быть проблемой с производительностью, потребуется лучший подход.
Вы правы, я заметил, что после приближения к 1000 записей (3 поля на запись) я получил следующую ошибку в php .. [10-Dec-2018 14:42:21 UTC] Предупреждение PHP: недопустимый аргумент для foreach ( ) в /home/username/public_html/calendrier/update.php в строке 10 И мой файл json был полностью стерт. Достаточно ли этого, чтобы создать проблему с php? Что вы предлагаете как лучший подход?
Где
if ($item->username == $username) || ($item->contest == $contest){? Похоже, что БД было бы проще использовать и управлять.