在PHP中使用foreach获取JSON数据

时间:2017-12-06 15:15:56

标签: php json foreach

网站包含JSON格式的月度数据。这可以这样查询:

http://www.example.com?startdate=1-1-1985&enddate=31-1-1985

我希望能够运行一个脚本来获取我正在寻找的特定数据,从今天开始,然后向后工作直到返回null数据。每个月的价值都需要加起来。到目前为止,这就是我所拥有的:

//Build base URL:
$userid=$_GET['userid'];
$startdate=/*Beginning of today's month*/;
$enddate=/*End of today's month*/;
$url='http://www.example.com?userid='.$userid.'&startdate='.$startdate.'&enddate='.$enddate;

//Set JSON variables:
$get=file_get_contents($url);
$json=json_decode($get);

//Set loop variables:
$value=0;
$month=0;

/*For each month from today backwards{
    $number=$json->integer;
    if($number!=null){
        $value=$value+$number;
        $month=$month+1;
    }else{
        break;
    }
}
echo $value;
echo $month;
*/

我遇到问题的部分是第四部分的开头。如何运行以今天的月份范围开始的循环,获取$ number,然后重复上个月,直到达到返回null的月份?

2 个答案:

答案 0 :(得分:0)

您可以使用DateTime对象及其相关联的方法(在本例中为sub),通过一次减去1个月来向后计数。数组存储月份/日期,并使用变量计数器$i

构建网址

最初它的最大后退范围是20年(我猜这已经足够了)但是它很容易改变。

$df='Y-m-d';
$userid=$_GET['userid'];

$timezone=new DateTimeZone('Europe/London');
$interval=new DateInterval('P1M');

$ts=date( $df, strtotime( date('Y-m-1') ) );
$tf=date( $df, strtotime( date('Y-m-1'). ' - 20 years') );

$start=new DateTime( $ts, $timezone );
$end=new DateTime( $tf, $timezone );

$dates=array();
$i=0;

while( $start->sub( $interval ) > $end ){
    $dates[]=$start->format( $df );
    if( $i > 1 ){

        $startdate=$dates[ $i - 1 ];
        $enddate=$dates[ $i ];
        $url='http://www.example.com?userid='.$userid.'&startdate='.$startdate.'&enddate='.$enddate;
        echo $url,'<br />';

        /* uncomment when happy with mechanism */
        /*

        $data=file_get_contents( $url );
        if( $data ) ) {
            $json=json_decode( $data );
            #process.....
            break;
        }
        */
    }
    $i++;
}

输出的片段

http://www.example.com?userid=bobodaclown&startdate=2017-10-01&enddate=2017-09-01
http://www.example.com?userid=bobodaclown&startdate=2017-09-01&enddate=2017-08-01
http://www.example.com?userid=bobodaclown&startdate=2017-08-01&enddate=2017-07-01
http://www.example.com?userid=bobodaclown&startdate=2017-07-01&enddate=2017-06-01
http://www.example.com?userid=bobodaclown&startdate=2017-06-01&enddate=2017-05-01
http://www.example.com?userid=bobodaclown&startdate=2017-05-01&enddate=2017-04-01
http://www.example.com?userid=bobodaclown&startdate=2017-04-01&enddate=2017-03-01

答案 1 :(得分:0)

通过使用strtotime()和mktime()函数,您可以循环直到获得Null结果。以下代码将打印5个网址5个月。相应地改变条件。

// define $i
$i=0;
$userid = '343';//$_GET['userid'];  //dont forget to replace with userid
do{
    $timestring =  strtotime("now -$i month");
    //get Month
    $month = date('m',$timestring);
    //get Year
    $year = date('Y',$timestring);
    // First date Month and Year
    $startdate = date('d-m-Y', mktime(0, 0, 0, $month, 1, $year));
    // Last date Month and Year
    $enddate = date('d-m-Y', mktime(0, 0, 0, $month+1, 0,$year));

    $url='http://www.example.com?userid='.$userid.'&startdate='.$startdate.'&enddate='.$enddate;
    // commenting your code 
    //Set JSON variables:
    //$get=file_get_contents($url);
    //$json=json_decode($get);
    // $number=$json->integer;
    echo $url;
    echo "\n";
    $i++;
}while ($i!=5); // change while condition according to your requirement. while ($number!=null)  

Out Put:

http://www.example.com?userid=343&startdate=01-12-2017&enddate=31-12-2017
http://www.example.com?userid=343&startdate=01-11-2017&enddate=30-11-2017
http://www.example.com?userid=343&startdate=01-10-2017&enddate=31-10-2017
http://www.example.com?userid=343&startdate=01-09-2017&enddate=30-09-2017
http://www.example.com?userid=343&startdate=01-08-2017&enddate=31-08-2017