PHP搜索多维数组和返回键 - 超级超大变量数组

时间:2012-12-03 10:43:12

标签: php arrays dynamic multidimensional-array search

大家好,我目前正在使用一个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
        )

如果有人能指出我正确的方向,那就太棒了!我已经搜索了几天和几天,但无法理解......我打赌你也很简单:(

4 个答案:

答案 0 :(得分:2)

首先,知道是否有一种方法可以从GW2 API服务器中检索自上次“全部获取”以来的UPDATED项目。这意味着您只需要检索整个数组一次,然后更新每次更新的几条记录。

  1. 您可以使用array_chunk http://php.net/manual/en/function.array-chunk.php
  2. 之类的东西拆分数组
  3. 使用这些拆分数组为MySQL等数据库生成批量插入语句。
  4. 使用简单的SELECT查询来检索语句。
  5. 如果你想在没有数据库的情况下这样做,你只需要使用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 

See Live Demo

使用的课程

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;
    }
}