Php in_数组的数据类型错误
早上好 我目前正试图为我的一个脚本构建一个非常基本的缓存系统。缓存是JSON数据,只包含1个键和它的值,但有许多单独的字段,类似这样Php in_数组的数据类型错误,php,arrays,function,Php,Arrays,Function,早上好 我目前正试图为我的一个脚本构建一个非常基本的缓存系统。缓存是JSON数据,只包含1个键和它的值,但有许多单独的字段,类似这样 {"Item1":"Item1 Description"} {"Item2":"Item2 Description"} {"Item3":"Item3 Description"} 我打算做的是 首先检查缓存文件是否可用 然后检查缓存中是否存在项 然后添加新项及其说明(如果它不在缓存中) …或返回项目说明(如果不存在) 存储的所有数据都是字符串。缓存文件不存储
{"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];
}
}
函数ItemIsInCache($CacheFile,$ItemId){
如果(文件_存在($CacheFile)){
$json=json_decode(file_get_contents($CacheFile,true));
if(在数组中($ItemId,$json)){//如果项存在,则返回说明,否则将新项添加到缓存中
这些项目及其相关描述不会改变,但我正在从一个速率有限的API中提取它们,并且我需要确保缓存所有我能缓存的内容,以使每个人受益
那么,你知道我用这个函数做错了什么吗?我肯定我忽略了一件非常简单的事情。你的文件不是用于勘误表的JSON。数组的正确JSON是
[
{"Item1":"Item1 Description"},
{"Item2":"Item2 Description"},
{"Item3":"Item3 Description"}
]
您缺少数组周围的括号,因此只得到一个对象
创建初始文件时,需要执行以下操作:
$ejson = json_encode(array($item));
因此,它被初始化为一个项目的数组,而不仅仅是一个项目。你为什么要重新发明轮子?你有没有看过memcached(或单服务器的APC)或者redis?另外,您是否对文件进行了锁定,以防止并发请求损坏您的文件?@PhpMyCoder我正在寻找一个小型解决方案,以缓存非常特定的数据,而不需要额外的库。由于它位于共享网络主机上,我甚至不知道是否有能力安装此类软件包。不会有其他脚本或者像访问单个项目的文件那样访问该文件,因此损坏的风险最小,甚至不存在。您可以使用var_export()同时,删除json依赖项。+1,很好的捕获,这是我最后注意到的。那里的数据只是一个示例。事实上,缓存文件中不存在任何数据,因此我正在构建一个解决方案来处理自动编码和解码。当您第一次创建文件时,它需要包含一个空数组[]
。空文件与空数组不是一回事。我可能没有正确解释自己。我希望在缓存文件不存在时创建它,然后将数据解析为JSON数组(按照您描述的方式)。这就是问题所在。手动向文件中添加方括号并不能解决向缓存中添加额外项的问题,因此,再次运行脚本只会导致删除这些项并用新项替换现有的示例项,但不会添加[]
。你缩进代码的方式让我觉得你没有为if(file_exists($CacheFile)){
设置else
子句。我已经更新了答案。