Я пытался сделать это некоторое время сейчас, и я просто не могу понять это правильно. Один пост меня очень близко, но не совсем, потому что моя иерархия JSON. (это назначение, и эта иерархия обязательна.)
Что я делаю сейчас — это отправляю информацию с одной страницы, помещаю ее в мой php на другой странице, сохраняю там в массиве, json_encode для этого массива и записываю в мой файл JSON.
Вот мой разбавленный код, надеюсь избавиться от самого ненужного кода:
<?php
$filename = "json/exercises.json";
$filesize = filesize($filename);
$fp = fopen($filename, "r+");
#Accept the submitted form
$exLanguage = $_POST['exLanguage'];
$exTitle = $_POST['exTitle'];
$exStuff = $_POST['exStuff'];
#write to JSON with an incrementing ID
if (file_get_contents($filename) == "") {
$exercise = array (
"id" => 1,
"lang" => $exLanguage,
"title" => $exTitle,
"main_object" =>
[
"exStuff" => $exStuff
]
);
$exercise_json = json_encode($exercise, JSON_PRETTY_PRINT);
file_put_contents($filename, $exercise_json, FILE_APPEND);
} else {
#Get the last set ID
$jsonid = json_decode(fread($fp, $filesize), true);
$last = end($jsonid);
$title = prev($jsonid);
$lang = prev($jsonid);
$id = prev($jsonid);
$exercise = array (
"id" => ++$id,
"lang" => $exLanguage,
"title" => $exTitle,
"main_object" =>
[
"exStuff" => $exStuff
]
);
$exercise_json = json_encode($exercise, JSON_PRETTY_PRINT);
file_put_contents($filename, $exercise_json, FILE_APPEND);
}
?>
теперь, что это делает, если мой json пуст, он правильно добавляет первый массив с идентификатором 1. Затем, если я пытаюсь снова добавить его в json, он добавляет его правильно с идентификатором 2. Но любые дальнейшие попытки записи в JSON даст мне эти ошибки:
Предупреждение: end () ожидает, что параметр 1 будет массивом, задан ноль
Предупреждение: prev () ожидает, что параметр 1 будет массивом, задан ноль
Предупреждение: prev () ожидает, что параметр 1 будет массивом, задан ноль
Предупреждение: prev () ожидает, что параметр 1 будет массивом, задан ноль
Я пытался сделать
$reset = reset($jsonid);
после записи в файл, но это не сработало, просто выдало мне еще одну ошибку при 3-й записи для сброса, также получившего ноль.
Может кто-нибудь сказать, пожалуйста, как заставить это тоже работать? Или, если есть гораздо более простой способ сделать это?
Сначала поймите формат JSON. Это коллекция объектов, что означает attribute: value
пара, завернутая в {}
и через запятую ,
а затем снова завернутый в {}
ИЛИ ЖЕ []
на высшем уровне.
Ваша структура JSON неполна или повреждена. То, что вы делаете в настоящее время, создаст JSON в следующем формате в вашем файле JSON:
{ "id": 1, "lang": "as", "title": "asdsad" }
{ "id": 2, "lang": "as", "title": "asdsad" }
{ "id": 3, "lang": "as", "title": "asdsad" }
{ "id": 4, "lang": "as", "title": "asdsad" }
Так json_decode
вернусь null
в этом случае из-за неверного формата JSON.
Вам нужно продолжать добавлять свой новый JSON в существующий JSON так, чтобы вышеуказанный формат стал таким:
[
{ "id": 1, "lang": "as", "title": "asdsad" },
{ "id": 2, "lang": "as", "title": "asdsad" },
{ "id": 3, "lang": "as", "title": "asdsad" },
{ "id": 4, "lang": "as", "title": "asdsad" }
]
Что означает ваш else
блок неверный. Используйте следующий код в else
блок:
$jsonid = json_decode(file_get_contents($filename), true);
$last = end($jsonid);
$id = $last['id'];
$jsonid[] = array (
"id" => ++$id,
"lang" => $exLanguage,
"title" => $exTitle,
"main_object" => array("exStuff" => $exStuff)
);
$exercise_json = json_encode($jsonid, JSON_PRETTY_PRINT);
file_put_contents($filename, $exercise_json, FILE_APPEND);
Я надеюсь, что вы не обязаны использовать этот неправильный / поврежденный формат JSON. Это не будет работать с json_decode()
в любом случае.
Других решений пока нет …