大家好,我目前正在使用一个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兆字节。 它拥有每件商品的每一个价格...... 好吧基本上我需要的是搜索“黄昏”或其项目ID'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
)
如果有人能指出我正确的方向,那就太棒了!我已经搜索了几天和几天,但无法理解......我打赌你也很简单:(
答案 0 :(得分:2)
首先,知道是否有一种方法可以从GW2 API服务器中检索自上次“全部获取”以来的UPDATED项目。这意味着您只需要检索整个数组一次,然后更新每次更新的几条记录。
如果你想在没有数据库的情况下这样做,你只需要使用for-loop搜索项目......
for($i = 0; $i < $array['count']; $i++)
{
if ($array['results'][$i]['name'] == 'Dusk')
// you found the item
}
答案 1 :(得分: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++;
}
答案 2 :(得分: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');
答案 3 :(得分: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;
}
}