【问题标题】:PHP Outputting results based on greater than/less than from JSONPHP基于大于/小于JSON输出结果
【发布时间】:2013-05-27 20:45:36
【问题描述】:

我试图让这个脚本根据大于/小于脚本输出结果。当我运行这个脚本时,它会输出文本文件中的第一行。关于我缺少什么的任何建议?

<?php
$lines     = file('unique.txt'); // Reads the file with the list of user numbers
$timestamp = time(); // Defines time for below renaming

foreach ($lines as $usernumber) { // Loops line by line
    $link = 'http://backpack.tf/api/IGetUsers/v2/?&steamids=' . $usernumber . '&format=json';
    $json = file_get_contents($link); // Reads link (this ^)
    $data = json_decode($json); // Defines decode as json
    if (!empty($data)) {
        $profiles = array(); //init array so we can use $profiles[] later
        foreach ($data->response->players as $player) { // Loop thrugh all the players
            $player2 = $player->backpack_value;
            if ($player2 < 9999999) { // Check the backpack_value
                $profiles[] = $player; // Assign the required players to a new array

                var_dump($profiles); // Dump the array to browser for debugning
                $fh = fopen("final." . $timestamp . ".txt", 'a') or die("can't open file"); // Opens final.txt to write in
                fwrite($fh, $usernumber); // Writes the parsed results to final.txt
            } //closes if $playtime

        } //closes foreach $data
    } //closes if !empty
    else {
        echo $data;
    }
} //closes foreach $lines

?>

Unique.txt 包含

76561197992831594
76561197992707820
76561197992146126
76561197992694522
76561197992707820
76561197992831594

JSON 示例

{
    "response": {
        "success": 1,
        "current_time": 1369685515,
        "players": {
            "0": {
                "steamid": "76561197992831594",
                "success": 1,
                "backpack_value": 47.97,
                "backpack_update": 1369683750,
                "name": "WesFox13",
                "notifications": 0
            }
        }
    }
}

【问题讨论】:

  • 可能不是问题,但如果你移动 `$fh = fopen("final." . $timestamp . ".txt", 'a') 或 die("can' t 打开文件"); // 打开 final.txt 以写入到 foreach 之外(就像之前的行一样。现在每次找到匹配项时都重新打开文件。
  • 听起来不错,我把它移到了我的个人脚本中,现在我将把它留在这个上。仍在试图找出我哪里出错了......
  • 如果它只是再次回显 $data,显然 json_decode 失败。使用json_last_error()var_dump($json) 看看发生了什么。很可能该服务器没有返回有效的 json,或者返回根本不是 json 的东西(例如,反爬虫/ToS 违规通知)。

标签: php json api


【解决方案1】:

好的有两个基本问题。

  1. fopen 调用需要移出循环。
  2. 文件调用有一个令人讨厌的习惯,即保留尾随换行符。当你建立你的网址时,你应该使用trim($usernumber) 来摆脱它。

这里是关于这两件事的更新。

<?php
$lines     = file('unique.txt'); // Reads the file with the list of user numbers
$timestamp = time(); // Defines time for below renaming

$fh = fopen("final." . $timestamp . ".txt", 'a') or die("can't open file"); // Opens final.txt to write in
foreach ($lines as $usernumber) { // Loops line by line
    $link = 'http://backpack.tf/api/IGetUsers/v2/?&steamids=' . trim($usernumber) . '&format=json';
    $json = file_get_contents($link); // Reads link (this ^)
    $data = json_decode($json); // Defines decode as json
    print_r($json);
    if (!empty($data)) {
        $profiles = array(); //init array so we can use $profiles[] later
        foreach ($data->response->players as $player) { // Loop thrugh all the players
            $player2 = $player->backpack_value;
            if ($player2 < 9999999) { // Check the backpack_value
                $profiles[] = $player; // Assign the required players to a new array

                var_dump($profiles); // Dump the array to browser for debugning
                fwrite($fh, $usernumber); // Writes the parsed results to final.txt
            } //closes if $playtime

        } //closes foreach $data
    } //closes if !empty
    else {
        echo $data;
    }
} //closes foreach $lines

【讨论】:

  • 我会仔细研究这个,看看我做错了什么,感谢 TON,它真的很有帮助!
  • 不是问题...最大的是修剪然后构建 url(您分配链接的位置)以在将来调试此类问题,使用 echo and die 是个好主意慷慨地确保你发送和接收你想要的东西
【解决方案2】:

我已经用 CURL 完成了这个,它也可以工作。

代码:

$lines = array('76561197992831594','76561197992707820','76561197992146126');
    $timestamp = time(); // Defines time for below renaming

    foreach ($lines as $usernumber) { // Loops line by line
        $link = 'http://backpack.tf/api/IGetUsers/v2/?&steamids=' . $usernumber . '&format=json';
        $json = curl_download($link); // Reads link (this ^)
        $data = json_decode($json); // Defines decode as json
        if (!empty($data)) {
            $profiles = array(); //init array so we can use $profiles[] later
            foreach ($data->response->players as $player) { // Loop thrugh all the players
                $player2 = $player->backpack_value;
                if ($player2 < 9999999) { // Check the backpack_value
                    $profiles[] = $player; // Assign the required players to a new array

                    var_dump($profiles); // Dump the array to browser for debugning
                     file_put_contents("final." . $timestamp . ".txt", $usernumber);
                } //closes if $playtime

            } //closes foreach $data
        } //closes if !empty
        else {
            echo $data;
        }
    } 

卷曲下载功能:

function curl_download($Url){

// is cURL installed yet?
if (!function_exists('curl_init')){
    die('Sorry cURL is not installed!');
}

// OK cool - then let's create a new cURL resource handle
$ch = curl_init();

// Now set some options (most are optional)

// Set URL to download
curl_setopt($ch, CURLOPT_URL, $Url);

// Set a referer
curl_setopt($ch, CURLOPT_REFERER, "http://www.google.pl");

// User agent
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla Firefox/1.0");

// Include header in result? (0 = yes, 1 = no)
curl_setopt($ch, CURLOPT_HEADER, 0);

// Should cURL return or print out the data? (true = return, false = print)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Timeout in seconds
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

// Download the given URL, and return output
$output = curl_exec($ch);

// Close the cURL resource, and free system resources
curl_close($ch);

return $output;

输出:

array(1) { [0]=> object(stdClass)#102 (6) { ["steamid"]=> string(17) "76561197992831594" ["success"]=> int(1) ["backpack_value"]=> float(47.97) ["backpack_update"]=> int(1369683750) ["name"]=> string(8) "WesFox13" ["notifications"]=> int(0) } } array(1) { [0]=> object(stdClass)#106 (6) { ["steamid"]=> string(17) "76561197992707820" ["success"]=> int(1) ["backpack_value"]=> float(59.78) ["backpack_update"]=> int(1369689171) ["name"]=> string(10) "Alexsutton" ["notifications"]=> int(0) } } array(1) { [0]=> object(stdClass)#98 (6) { ["steamid"]=> string(17) "76561197992146126" ["success"]=> int(1) ["backpack_value"]=> float(36181.59) ["backpack_update"]=> int(1369689000) ["name"]=> string(25) ":HIT: Bobo the Monkey Boy" ["notifications"]=> int(0) } }

我给你的建议是当你想从 Web 下载东西时使用 CURL。此外,使用 file_get_contents()file_put_contents() 语法很短,它们的作用相同,而且更易于使用。

【讨论】:

  • 我也会研究这个。我听说 CURL 是我无论如何都应该使用的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多