【问题标题】:Parse a json array in PHP to get the required values在 PHP 中解析一个 json 数组以获取所需的值
【发布时间】:2013-05-18 02:19:49
【问题描述】:

我正在使用本网站提供的 API

http://pnrapi.alagu.net/

通过使用此 API,我们可以获得印度铁路的 PNR 状态。

我正在使用 CURL 进行调用并以数组格式获取类似这样的页面内容:

数组 ( [url] => http://pnrapi.alagu.net/api/v1.0/pnr/4563869832 [content_type] => application/json;charset=utf-8 [http_code] => 200 [header_size] = > 185 [request_size] => 130 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 2.906 [namelookup_time] => 0 [connect_time] => 0.312 [pretransfer_time] => 0.312 [size_upload] => 0 [size_download] => 548 [speed_download] => 188 [speed_upload] => 0 [download_content_length] => 548 [upload_content_length] => 0 [starttransfer_time] => 2.906 [redirect_time] => 0 [ certinfo] => Array () [primary_ip] => 50.57.204.234 [primary_port] => 80 [local_ip] => 192.168.1.10 [local_port] => 60105 [redirect_url] => [errno] => 0 [errmsg] = > [内容] => {"status":"OK","data":{"train_number":"16178","chart_prepared":false,"pnr_number":"4563869832","train_name":"ROCKFORT EXPRES" ,"travel_date":{"timestamp":1369506600,"date":"26-5-2013"},"from":{"code":"TPJ","name":"TIRUCHIRAPPALLI JUNCTION","time" :"22:20"},"to":{"code":"MS","name":"CHE NNAI EGMORE","time":"05:15"},"alight":{"code":"MS","name":"CHENNAI EGMORE","time":"05:15"},"board ":{"code":"TPJ","name":"TIRUCHIRAPPALLI JUNCTION","time":"22:20","timestamp":1369587000},"class":"2A","passenger":[ {"seat_number":"W/L 39,RLGN","status":"W/L 27"}]}} )

但是当我转到 URL http://pnrapi.alagu.net/api/v1.0/pnr/4563869832 时,它给我的输出如下所示:

 {"status":"OK","data":{"train_number":"16178","chart_prepared":false,"pnr_number":"4563869832","train_name":"ROCKFORT EXPRES","travel_date ":{"timestamp":1369506600,"date":"26-5-2013"},"from":{"code":"TPJ","name":"TIRUCHIRAPPALLI JUNCTION","time":"22 :20"},"to":{"code":"MS","name":"CHENNAI EGMORE","time":"05:15"},"alight":{"code":"MS" ,"name":"CHENNAI EGMORE","time":"05:15"},"board":{"code":"TPJ","name":"TIRUCHIRAPPALLI JUNCTION","time":"22: 20","timestamp":1369587000},"class":"2A","passenger":[{"seat_number":"W/L 39,RLGN","status":"W/L 27"}]} }

现在,我的 web 页面上的 curl 输出似乎有一些额外的文本,在开头你可以看到上面的两个输出。

好吧,我的问题是,我怎样才能从上面的数组中获取值。

我说的是我使用 CURL 在我的页面上得到的数组输出,它看起来像这样:

Array ( 
[url] => http://pnrapi.alagu.net/api/v1.0/pnr/4563869832 
[content_type] =>     application/json;charset=utf-8 
[http_code] => 200 
[header_size] => 185 
[request_size] =>     130 
[filetime] => -1 
[ssl_verify_result] => 0 
[redirect_count] => 0 
[total_time] => 2.906     
[namelookup_time] => 0 
[connect_time] => 0.312 
[pretransfer_time] => 0.312 
[size_upload] => 0 
[size_download] => 548 
[speed_download] => 188 
[speed_upload] => 0 
[download_content_length] => 548 
[upload_content_length] => 0 
[starttransfer_time] => 2.906 
[redirect_time] => 0 
[certinfo] => Array ( ) 
[primary_ip] => 50.57.204.234 
[primary_port] => 80 
[local_ip] => 192.168.1.10 
[local_port] => 60105 
[redirect_url] => 
[errno] => 0 
[errmsg] => [content] => {"status":"OK","data":{"train_number":"16178","chart_prepared":false,"pnr_number":"4563869832","train_name":"ROCKFORT EXPRES","travel_date":{"timestamp":1369506600,"date":"26-5-2013"},"from":{"code":"TPJ","name":"TIRUCHIRAPPALLI JUNCTION","time":"22:20"},"to":{"code":"MS","name":"CHENNAI EGMORE","time":"05:15"},"alight":{"code":"MS","name":"CHENNAI EGMORE","time":"05:15"},"board":{"code":"TPJ","name":"TIRUCHIRAPPALLI JUNCTION","time":"22:20","timestamp":1369587000},"class":"2A","passenger":[{"seat_number":"W/L 39,RLGN","status":"W/L 27"}]}} )

我的 PHP 页面中的代码是:

    <?php
function get_web_page( $url )
{
$options = array(
    CURLOPT_RETURNTRANSFER => true,     // return web page
    CURLOPT_HEADER         => false,    // don't return headers
    CURLOPT_FOLLOWLOCATION => true,     // follow redirects
    CURLOPT_ENCODING       => "",       // handle all encodings
    CURLOPT_USERAGENT      => "spider", // who am i
    CURLOPT_AUTOREFERER    => true,     // set referer on redirect
    CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
    CURLOPT_TIMEOUT        => 120,      // timeout on response
    CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
);

$ch      = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err     = curl_errno( $ch );
$errmsg  = curl_error( $ch );
$header  = curl_getinfo( $ch );
curl_close( $ch );

$header['errno']   = $err;
$header['errmsg']  = $errmsg;
$header['content'] = $content;
return $header;
}
$pnr = get_web_page('http://pnrapi.alagu.net/api/v1.0/pnr/4563869832');
echo "<code>";
print_r($pnr);
echo "</code>";
?>

我只需要“内容”下的值,即列车号、列车名称、旅行日期等。

那么,将这些信息提取到每个变量中的最佳方法是什么?

就像我想要的那样:

$train_no   = [some code];
$train_name = [some_code];

等等……

提前致谢。

我试过了:

回声 $pnr['content'];

我得到的输出是:

{"status":"OK",    
"data":"train_number":"16178",
"chart_prepared":false,
"pnr_number":"4563869832",
"train_name":"ROCKFORT EXPRES",
"travel_date":{"timestamp":1369506600,"date":"26-5-2013"},
"from":{"code":"TPJ","name":"TIRUCHIRAPPALLI JUNCTION","time":"22:20"},
"to":{"code":"MS","name":"CHENNAI EGMORE","time":"05:15"},
"alight":{"code":"MS","name":"CHENNAI EGMORE","time":"05:15"},
"board":{"code":"TPJ","name":"TIRUCHIRAPPALLI JUNCTION","time":"22:20","timestamp":1369587000},
"class":"2A","passenger":[{"seat_number":"W/L 39,RLGN","status":"W/L 27"}]}}  

现在谁能告诉我如何从上面的数组中获取唯一值?

【问题讨论】:

    标签: api


    【解决方案1】:

    我不确定 JSON 字符串在哪里。但假设它是 $pnr 变量。

    $json = json_decode($pnr, true);
    $train_no = $json["data"]["train_number"];
    $train_name = $json["data"]["train_name"];
    

    更新: 如果您不需要所有其他的东西,您可以执行以下操作:

    $npr = file_get_contents(url);
    

    然后运行上面的代码。

    【讨论】:

    • 对不起,它给了我这个警告:警告:json_decode() 期望参数 1 是字符串,
    • 更新了我的回复。我不完全确定你需要 get_web_page 做什么。
    • 谢谢 BjarkeHS,您的代码在某种程度上可以完美运行,但现在我明白了:Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\PNR\index.php on line 52 有什么想法吗?
    • 干杯,我找到了对您的代码稍作调整的解决方案。我试过这个:$json = json_decode($pnr,true); 非常感谢!你是男人;)
    【解决方案2】:

    您正在查看header,您应该查看content。在您的函数中返回$content,然后您可以解析出响应:

    function get_web_page( $url ) {
        $options = array(
            CURLOPT_RETURNTRANSFER => true,     // return web page
            CURLOPT_HEADER         => false,    // don't return headers
            CURLOPT_FOLLOWLOCATION => true,     // follow redirects
            CURLOPT_ENCODING       => "",       // handle all encodings
            CURLOPT_USERAGENT      => "spider", // who am i
            CURLOPT_AUTOREFERER    => true,     // set referer on redirect
            CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
            CURLOPT_TIMEOUT        => 120,      // timeout on response
            CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
        );
    
        $ch = curl_init( $url );
        curl_setopt_array( $ch, $options );
        $content = json_decode( curl_exec( $ch ) );
    
        curl_close( $ch );
    
        return array(
            'train_no' => $content->data->train_number,
            'train_name' => $content->data->train_name,
        );
    }
    
    $pnr = get_web_page('http://pnrapi.alagu.net/api/v1.0/pnr/4563869832');
    
    echo "<pre>" . print_r($pnr, true) . "</pre>";
    

    【讨论】:

    • 你也可以大大减少你的options,除非你出于某种原因需要它们——你真正需要的只有CURLOPT_RETURNTRANSFER
    • 非常感谢 jterry 的建议,我已经删除了除 CURL_RETURNTRANSFER 之外的所有选项,但恐怕我仍然收到此错误:( ! ) Warning: json_decode() expects parameter 1 to be string, array given in C:\wamp\www\PNR\index.php on line 55 Call Stack # Time Memory Function Location 1 0.0011 144848 {main}( ) ..\index.php:0 2 3.2365 145616 json_decode ( ) ..\index.php:55
    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多