0

おはようございます。

現在、スクリプトの 1 つに対して非常に基本的なキャッシュ システムを構築しようとしています。キャッシュは 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()in_array()、それぞれ 4 行目と 9 行目にあります (これらは上記のコードの行番号です - 私のスクリプトの性質上、これらの番号は後述します) -- 簡単にするために、問題のある行を でマークしました// <<

関数はループで実行されていますが、問題はありません。問題はこの機能にあります。

現在起きていること

現在、キャッシュが存在しない場合は、キャッシュを作成し、ループの最初の項目をそれぞれの JSON 形式でキャッシュ ファイルに追加します (キャッシュ ファイルが存在しないため、最後のelseステートメントの後に発生します)。

ただし、おそらくファイルが存在し、コードに問題があるため、その後のループからのアイテムは追加されません。

関数の最後の部分は希望どおりに機能しますが、最初の部分は機能しません。

修正されたコードで予想される動作

キャッシュをチェック > アイテムが存在する場合は説明を返す ELSE 新しいアイテムをキャッシュに追加します。

アイテムとそれに関連する説明は変更されませんが、私はレート制限された API からそれらを取得しているので、全員の利益のためにできる限りキャッシュする必要があります。

それで、私が関数で間違っていることについて何か考えはありますか? 私が見落としているのは、信じられないほど単純なものだと確信しています。

4

1 に答える 1

2

あなたのファイルはエラーの JSON ではありません。配列の正しい JSON は

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

配列を囲む括弧がないため、1 つのオブジェクトしか取得できません。

初期ファイルを作成するときは、次のことを行う必要があります。

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

単なるアイテムではなく、1 つのアイテムの配列として初期化されるようにします。

于 2013-05-05T03:03:42.847 に答える