早上好。
我正在尝试为我的一个脚本构建一个非常基本的缓存系统。缓存是JSON数据,只包含1个密钥及其值,但是包含许多单独的字段,如下所示;
{"Item1":"Item1 Description"}
{"Item2":"Item2 Description"}
{"Item3":"Item3 Description"}
我打算做的是;
存储的所有数据都是字符串。缓存文件不存储任何其他类型的数据。
我已经整理了一个基本功能,但我无法使其正常运行;
function ItemIsInCache($CacheFile, $ItemId) {
if(file_exists($CacheFile)) {
$json = json_decode(file_get_contents($CacheFile, true));
if(in_array($ItemId, $json)) { // <<
$itemname = array_search($ItemId, $json);
return itemname;
} else {
$item[$itemId] = GrabItemName($ItemId);
$itemname = array_search($ItemId, $json); // <<
return $itemname;
}
} else {
$item[$ItemId] = GrabItemName($ItemId);
$ejson = json_encode($item);
file_put_contents($CacheFile, $ejson);
return $item[$ItemId];
}
}
备注
GrabItemName
是一个不同的函数,它根据$ItemId
返回描述数据。
我在Wrong datatype for second argument
和array_search()
分别在第4行和第9行发出警告in_array()
(这些是上述代码中的行号 - 由于我的脚本的性质这些数字稍后会出现 - 为简单起见,我用// <<
标记了问题行。
该函数在循环中运行,我没有遇到任何问题。问题在于这个功能。
目前发生的事情
现在,如果缓存不存在,它会创建它,并将循环中的第一项添加到缓存文件中,其中包含相应的JSON格式(由于缓存文件不存在而触发,因此在最后else
声明)。
但是,之后循环中的项目不会被添加,大概是因为文件存在且代码有问题。
该函数的最后一部分完全按照我的要求工作,但第一部分没有。
使用固定代码的预期行为
检查缓存&gt;如果项目存在则返回描述ELSE将新项目添加到缓存。
这些项目及其相关描述不会改变,但我会从限速API中提取它们,我需要确保尽可能地为每个人的利益缓存。
那么,任何想法我对这个功能的错误是什么?我确信这是一件令人难以置信的简单事情,我忽略了它。
答案 0 :(得分:2)
您的文件不是错误的JSON。数组的正确JSON是
[
{"Item1":"Item1 Description"},
{"Item2":"Item2 Description"},
{"Item3":"Item3 Description"}
]
你错过了数组周围的括号,所以你只得到一个对象。
创建初始文件时,您需要执行以下操作:
$ejson = json_encode(array($item));
因此它被初始化为一个项目的数组,而不仅仅是一个项目。