2

こんにちは、私は現在、MMO から価格をかき集めて配列に表示するために構築された API を使用しています。現時点では、これは私のコードです:

    <?php 
ini_set('max_execution_time', 0);
$data = json_decode(file_get_contents("http://www.gw2spidy.com/api/v0.9/json/all-items/all"), true);
foreach($data as $item) {
    echo '<pre>';
    print_r($data);
    echo '</pre>';
}
?>

これは MASSIVE 配列を返します。html ファイルを保存したところ、約 35 メガバイトです。それはすべてのアイテムのすべての価格などを持っています...わかりましたので、基本的に必要なのは、「ダスク」などのアイテムを検索するか、アイテムID「29185」で検索することです。価格と配列キーは 1 時間ごとに変わるので、毎回このデータを動的に抽出する方法を見つけようとしていますが、困惑しています...

配列は次のように構成されています。

Array
(
    [count] => 19959
    [results] => Array
        (
    [15875] => Array
        (
            [data_id] => 29185
            [name] => Dusk
            [rarity] => 5
            [restriction_level] => 80
            [img] => https://dfach8bufmqqv.cloudfront.net/gw2/img/content/fabc9042.png
            [type_id] => 18
            [sub_type_id] => 6
            [price_last_changed] => 2012-12-03 08:30:49 UTC
            [max_offer_unit_price] => 3180000
            [min_sale_unit_price] => 3890000
            [offer_availability] => 5574
            [sale_availability] => 6
            [gw2db_external_id] => 63505
            [sale_price_change_last_hour] => 0
            [offer_price_change_last_hour] => 0
        )

誰かが私を正しい方向に向けることができれば、それは素晴らしいことです! 私は何日も何日も検索しましたが、それを理解することはできません.それも本当に簡単だと思います:(

4

4 に答える 4

2

まず、GW2 API サーバーから、最後の「すべてを取得」してから更新されたアイテムのみを取得する方法があるかどうかを知っておくとよいでしょう。これは、この配列全体を 1 回取得するだけでよく、そのたびに更新されるいくつかのレコードを更新する必要があることを意味します。

  1. array_chunk http://php.net/manual/en/function.array-chunk.phpのようなものを使用して配列を分割できます
  2. これらの分割配列を使用して、MySQL などのデータベースのバッチ挿入ステートメントを生成します。
  3. 単純な SELECT クエリを使用してステートメントを取得します。

DB なしで実行したい場合は、for ループを使用してアイテムを検索するだけです...

for($i = 0; $i < $array['count']; $i++)
{
    if ($array['results'][$i]['name'] == 'Dusk')
     // you found the item
}
于 2012-12-03T10:56:32.897 に答える
0

再帰的な配列検索を試してください。array_search の php.net ページに投稿された再帰関数を使用した例を次に示します。この関数は実際には array_search php 関数を使用していませんが、多次元配列をサポートする同様の機能を提供していることに注意してください。

最初の機能:

function search($array, $key, $value)
{
    $results = array();

    if (is_array($array))
    {
        if (isset($array[$key]) && $array[$key] == $value)
            $results[] = $array;

        foreach ($array as $subarray)
            $results = array_merge($results, search($subarray, $key, $value));
        }

    return $results;
}

関数を使用します。

$data = json_decode(file_get_contents("http://www.gw2spidy.com/api/v0.9/json/all-items/all"), true);
$results = $data['results'];
$foundItems = search($results, 'name', 'Dusk');
print_r($foundItems);

これにより、名前に一致する結果内のすべてのアイテムの配列が得られます。同様に、id での検索は次のようになります。

$foundItems = search($results, 'data_id', '12345');
于 2012-12-03T11:31:48.493 に答える
0

これを試して。

ここでは、新しい配列を作成してアクセスするために使用しました。

ini_set('max_execution_time', 0);
$data = json_decode(file_get_contents("http://www.gw2spidy.com/api/v0.9/json/all-items/all"), true);
$new_arrry = array();
$i = 0;
foreach($data as $item) {
    $new_arry[$i] = $item['name'];
    $new_arry[$i] = $item['data_id'];
    $i++;
}
于 2012-12-03T11:07:36.373 に答える
0

優先ソリューション

MySQL のようなデータベースを使用してすべてのリクエストを保存し、JSON が変更された場合にのみデータベースを更新します。

$url = "http://www.gw2spidy.com/api/v0.9/json/all-items/all";
var_dump(get_headers($url));

出力

array (size=13)
  0 => string 'HTTP/1.1 200 OK' (length=15)
  1 => string 'Server: cloudflare-nginx' (length=24)
  2 => string 'Date: Mon, 03 Dec 2012 11:52:41 GMT' (length=35) <--- See Date
  3 => string 'Content-Type: application/json' (length=30)
  4 => string 'Content-Length: 8621869' (length=23)
  5 => string 'Connection: close' (length=17)
  6 => string 'cache-control: no-cache' (length=23)
  7 => string 'X-Varnish-TTL: 300.000' (length=22)
  8 => string 'Accept-Ranges: bytes' (length=20)
  9 => string 'Age: 135' (length=8)
  10 => string 'X-Varnish-Cache: HIT' (length=20)
  11 => string 'Set-Cookie: __cfduid=d249da7538d37614f7bc206fd407142eb1354535561; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.gw2spidy.com' (length=133)
  12 => string 'CF-RAY: 286a7d677b004f85' (length=24)

最後に変更されたことがわかるようにDate: Mon, 03 Dec 2012 11:52:41 GMT、このすべての情報をリクエストごとにプルするのは意味がありません

$url = "http://www.gw2spidy.com/api/v0.9/json/all-items/all";
$info = get_headers($url,true);

$lastDate = new DateTime();
$lastDate->setDate(2012, 12, 03); 

$dateModified = DateTime::createFromFormat("D, d M Y g:i:s \G\M\T", $info['Date']);
if($dateModified > $lastDate)
{

    //Parse Jason
    //Update Database etc 
}


// Select * from result where name = 'WHAT YOU WANT' 

*教育目的*

$filter = new \ProductIterator("http://www.gw2spidy.com/api/v0.9/json/all-items/all");
$filter->find("name", "dusk"); //<---- What you want to find 

echo "<pre>";
foreach ( $filter as $value ) {
    var_dump($value);
}

出力 (2件見つかりました)

Dusky Dye - 20428
Dusk Dye - 20564
Dusk - 29185

合計時間

1.4957299232483  <------------------ Total Time 

ライブデモを見る

使用クラス

class ProductIterator extends FilterIterator {
    private $key;
    private $value;

    public function __construct($url) {
        $data = json_decode(file_get_contents($url), true);
        parent::__construct(new ArrayIterator($data['results']));
        unset($data);
    }

    public function find($key, $value) {
        $this->key = $key;
        $this->value = $value;
    }

    public function accept() {
        $user = $this->getInnerIterator()->current();
        if (isset($user[$this->key])) {
            return stripos($user[$this->key], $this->value) !== false;
        }
        return false;
    }
}
于 2012-12-03T11:59:13.473 に答える