繁体   English   中英

in_array的dataype错误

[英]Wrong dataype for in_array

早上好。

我正在尝试为我的一个脚本构建一个非常基本的缓存系统。 缓存是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返回描述数据。

我得到的警告是array_search()in_array() Wrong datatype for second argument分别在第4行和第9行(这些是上面代码中的行号 - 由于我的脚本的性质,这些数字是稍后) - 为简单起见,我用// <<标记问题行。

该函数在循环中运行,我没有遇到任何问题。 问题在于这个功能。

目前发生了什么

现在,如果缓存不存在,它会创建它并将循环中的第一个项添加到缓存文件中,其中包含相应的JSON格式(由于缓存文件不存在而触发,因此在最后的else语句之后) 。

但是,之后循环中的项目不会被添加,大概是因为文件存在且代码有问题。

函数的最后一部分完全按照我的要求工作,但第一部分却没有。

使用固定代码的预期行为

如果项目存在,则检查缓存>返回描述ELSE将新项目添加到缓存。

这些项目及其相关描述不会改变,但我会从速率有限的API中提取它们,我需要确保尽可能地为每个人的利益缓存。

那么,任何想法我在做什么错误的功能? 我敢肯定这是一件令人难以置信的简单事情。

对于erray,您的文件不是JSON。 数组的正确JSON是

[
 {"Item1":"Item1 Description"},
 {"Item2":"Item2 Description"},
 {"Item3":"Item3 Description"}
]

你错过了数组周围的括号,所以你只得到一个对象。

创建初始文件时,您需要执行以下操作:

    $ejson = json_encode(array($item));

这样它就被初始化为一个项目的数组,而不仅仅是一个项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM