Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php in_数组的数据类型错误_Php_Arrays_Function - Fatal编程技术网

Php in_数组的数据类型错误

Php in_数组的数据类型错误,php,arrays,function,Php,Arrays,Function,早上好 我目前正试图为我的一个脚本构建一个非常基本的缓存系统。缓存是JSON数据,只包含1个键和它的值,但有许多单独的字段,类似这样 {"Item1":"Item1 Description"} {"Item2":"Item2 Description"} {"Item3":"Item3 Description"} 我打算做的是 首先检查缓存文件是否可用 然后检查缓存中是否存在项 然后添加新项及其说明(如果它不在缓存中) …或返回项目说明(如果不存在) 存储的所有数据都是字符串。缓存文件不存储

早上好

我目前正试图为我的一个脚本构建一个非常基本的缓存系统。缓存是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];    
  }
}
函数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
子句。我已经更新了答案。