2

您好,我目前正在使用构建的 API 从 MMO 中获取价格并将其显示在数组中。目前这是我的代码:

    <?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 兆字节。它有每件商品的每一个价格等......好吧,基本上我需要的是搜索一个项目,如“黄昏”或它的 itemID“29185”。价格和数组键每小时都在变化,所以我一直试图找出一种动态的方式来每次都提取这些数据,但我很难过......

数组的结构如下:

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. 您可以使用类似 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

试试这个。

在这里,您已经习惯了创建一个新数组并访问它。

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

尝试递归数组搜索。这是一个使用在 php.net 页面上发布的用于 array_search 的递归函数的示例。请注意,该函数实际上并不使用 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

首选解决方案

使用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 回答