我的 JSON 数组上的自动递增 ID

auto-incrementing ID on my JSON array

我已经尝试这样做一段时间了,但我似乎做不好。 让我非常接近但不是很接近,因为我的 JSON 的层次结构。 (这是一项任务,此层次结构是强制性的。)

我现在做的是从一个页面提交信息,POST它到我在另一个页面上的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 为空,它会正确添加 ID 为 1 的第一个数组。然后,如果我再次尝试添加到我的 json,它会正确添加它ID 为 2。但是任何更多尝试写入 JSON 都会给我这些错误:

Warning: end() expects parameter 1 to be array, null given

Warning: prev() expects parameter 1 to be array, null given

Warning: prev() expects parameter 1 to be array, null given

Warning: prev() expects parameter 1 to be array, null given

我试过

$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 在这种情况下会 return 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);

希望您不必使用那种 incorrect/corrupted JSON 格式。这在任何情况下都不适用于 json_decode()