автоинкрементный идентификатор в моем массиве JSON - PullRequest
0 голосов
/ 30 мая 2018

Я пытался сделать это некоторое время и просто не могу понять, как это правильно. Один пост очень близко подошел ко мне, но не совсем, потому что моя иерархия в 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 будет массивом, значение NULL

Предупреждение: prev () ожидает, что параметр 1 будет массивом, значение NULL

Предупреждение: prev () ожидает параметр 1быть массивом, задано значение NULL

Предупреждение: prev () ожидает, что параметр 1 будет массивом, задано значение NULL

Я попытался сделать

$reset = reset($jsonid);

после записиподать, но это не сработало, просто дал мне еще одну ошибкуили на третьей записи для сброса тоже даётся ноль.

Может кто-нибудь сказать, пожалуйста, как заставить это тоже работать?Или, если есть гораздо более простой способ сделать это?

1 Ответ

0 голосов
/ 30 мая 2018

Сначала поймите формат 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() в любом случае.

...