从URL中提取JSON API结果并在PHP中显示

时间:2016-07-10 12:44:46

标签: php json api

我一直试图通过反复试验这几天来做这件事,但绝对无处可去。 PHP并不是我的强项,但我对它很满意,当我需要做特定的事情时,我可以学习。

我尝试做的是从一个使用的平台获取API,并将其输入到另一个使用的平台。我可以通过URL轻松地从API获取数据,并且它可以在不同的服务器上正常运行,因此我非常确定在这方面的一切都很好。

问题是,当我设法从URL获取它时,它看起来非常混乱。到目前为止,我没有尝试过将它显示为一个漂亮整洁的块。此外,我希望能够从结果中提取特定数据并显示它。通过URL访问时数据如下(已更改隐私等值,但应保持完整性):

  

{" Data":[{" DeviceID":" 1"," DeviceName":" Phone 1&#34 ;,"平台":"电话操作系统","版本":"豪华","状态":&# 34; 0""时间":" 2016-03-16T13:47:44 + 01:00"}]}

基本上,我想要做的是:

  • 显示阻止列表中的数据,而不是长行
  • 允许通过"设备名称"选择特定设备,然后显示与该设备相关的信息

到目前为止,我已尝试过以下脚本:

1:

<?php
    $json = file_get_contents('URLHERE');
    $obj = json_decode($json);
    echo $obj->DeviceID;
?>

2:

<?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, 'URLHERE');
    $result = curl_exec($ch);
    curl_close($ch);

    $obj = json_decode($result);
    echo $result->DeviceName;
?>

3:

<?php 
    $url = 'URLHERE';
    $obj = json_decode(file_get_contents($url), true);
    echo $obj['DeviceID'];
?>

4:

<?php
    $url = "URLHERE";
    $json = file_get_contents($url);
    $json_data = json_decode($json, true);
    echo "Device: ". $json_data["DeviceID"];
?>

5:

<?php
    $json = file_get_contents('URLHERE');
    $encodeJ = utf8_encode($json);

    $obj = json_decode($encodeJ);
    var_dump($obj-> DeviceID);
?>

第四个是最接近我设法使用这些方法显示数据,而不是我刚收到的任何信息&#34;设备:NULL&#34;

任何帮助将不胜感激。开始把我的头发拉出来!

更新 已成功地通过以下方式取得了一些进展:

<?php
$data = file_get_contents('URLHERE');

$response = json_decode($data, true);

echo 'Device: ' . $response['Data']['0']['DeviceName'];
echo 'Device: ' . $response['Data']['1']['DeviceName'];

?>

这是显示值为0和1的数组中的设备名称。所以现在我需要弄清楚如何遍历数组并按顺序显示每个数组,而不是对每个数组进行硬编码。

2 个答案:

答案 0 :(得分:2)

DeviceID位于Data&amp;它是 array ,因此您无法直接访问。当你

$data = json_decode('{"Data":[{"DeviceID":"1","DeviceName":"Phone 1","Platform":"Phone OS","Edition":"Deluxe","State":"0","Time":"2016-03-16T13:47:44+01:00"}]}', true);//I am using array so second parameter is true to easily demonstrate

您的结构是

   [
     "Data" => [
       [
         "DeviceID" => "1",
         "DeviceName" => "Phone 1",
         "Platform" => "Phone OS",
         "Edition" => "Deluxe",
         "State" => "0",
         "Time" => "2016-03-16T13:47:44+01:00",
       ],
     ],
   ]

所以如果你想要那么只获得第一个DeviceID

$deviceID = isset($data['Data'][0]['DeviceID']) ? $data['Data'][0]['DeviceID'] : null;

或者如果你想要所有的DeviceID那么

    $deviceIds = [];
    if (isset($data['Data']) && is_array($data['Data']))
    {
        foreach ($data['Data'] as $row)
        {
            if (isset($row['DeviceID']))
            {
                $deviceIds[] = $row['DeviceID'];
            }
        }
    }

或者如果您的php版本是&gt; = 5.5.0或php 7

,您可以使用array_column
    $deviceIds = [];
    if (isset($data['Data']) && is_array($data['Data']))
    {
        $deviceIds = array_column($data['Data'], 'DeviceID');
    }

答案 1 :(得分:1)

要获取数据,请使用:

$json = file_get_contents( $url );

然后将其放入数组中,如:

$arr = json_decode( $json, TRUE );

要“显示阻止列表中的数据,而不是长行”,请使用:

foreach ( $arr AS $element ) {
  foreach ( $element AS $e ) {
    echo $e['DeviceName'] . '<br>';
  }
}

要“允许通过”设备名称“选择特定设备,然后显示与该设备相关的信息”,请使用:

$deviceName = "Phone 1"; // depending upon your use case, you'll need to decide how you want to set this variable; it's hard coded here for the sake of example

foreach ( $arr AS $element ) {
  foreach ( $element AS $e ) {
    if ( $e['DeviceName'] = $deviceName ) {
      echo '<pre>';
      print_r( $e );
      echo '</pre>';    
    }
  }
}

虽然“通过”设备名称“”允许选择特定设备并不完全清楚您的意思,但我倾向于相信您正在寻找让用户从列表中选择设备的方法。设备名称。这不是单独用PHP完成的任务。您需要在HTML或Javascript中为前端构建一些与后端PHP交互的内容。