簡體   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