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

时间:2018-05-30 13:50:29

标签: php arrays json auto-increment

我一直试图这样做一段时间,我似乎无法做到这一点。 One post让我非常接近但不完全是因为我的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是空的,它会正确地添加第一个数组,ID为1.然后,如果我再次尝试添加到我的json,它会正确添加它,ID为2.但是更多的尝试写入到JSON会给我这些错误:

  

警告:end()期望参数1为数组,给定

为null      

警告:prev()期望参数1为数组,给定

为null      

警告:prev()期望参数1为数组,给定

为null      

警告:prev()期望参数1为数组,给定

为null

我试过做

$reset = reset($jsonid);

写入文件后但是没有用,只是在第3次写入时给了我另一个错误,复位也被赋予了null。

任何人都可以告诉我如何让这个太有效了吗?或者,如果有更简单的方法来完成这项工作?

1 个答案:

答案 0 :(得分:1)

首先了解JSON格式。它是一组对象,意思是attribute: value对包裹在{}中并用逗号,分隔,然后再次包裹在{} OR []顶层。< / p>

您的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会因为JSON格式无效而返回null

您需要继续在现有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()