我的 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()
。
我已经尝试这样做一段时间了,但我似乎做不好。
我现在做的是从一个页面提交信息,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()
。