【问题标题】:Pull JSON API results from URL and display in PHP从 URL 中提取 JSON API 结果并在 PHP 中显示
【发布时间】:2016-07-10 12:44:46
【问题描述】:

几天来,我一直在尝试通过反复试验等方法来做到这一点,但绝对无济于事。 PHP 不是我的强项,但我通常对它感到满意,因为我可以在需要做特定事情时随时学习。

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

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

{"Data":[{"DeviceID":"1","DeviceName":"Phone 1","Platform":"Phone OS","Edition":"Deluxe","State":"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);
?>

第四个是我设法使用这些方法显示数据的最接近它的方法,但我只得到“设备:NULL”而不是任何信息

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

更新: 已设法在以下方面取得了一些进展:

<?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 的设备名称。所以现在我需要弄清楚如何遍历数组并按顺序显示每个设备名称,而不是对每个设备进行硬编码。

【问题讨论】:

    标签: php json api


    【解决方案1】:

    您的DeviceIDData 中,它是一个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'];
                }
            }
        }
    

    或者你可以使用array_column 如果你的 php 版本 >= 5.5.0 或 php 7

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

    【讨论】:

      【解决方案2】:

      要获取数据,请使用:

      $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 交互。

      【讨论】:

      • 这很有用,我可以用它来显示所有设备的信息。我稍微调整了一下,并改用:$deviceName = $arr['Data']['0']['DeviceName'];。我现在的问题是,它不是按顺序显示每个,而是仅在每个设备上显示数组值 0。因此,每个设备都显示特定于该设备的信息,除了名称始终是数组空间 0 的值。我将如何遍历该实例中的每个设备并显示正确的名称?
      • 虽然不完全清楚您所说的“允许通过“设备名称”选择特定设备”是什么意思:是的,认为这部分需要一些 JS。一旦我让核心功能正常工作,就会开始工作。目前,我认为主要任务是完整列出每个设备,然后努力选择特定设备。
      • 我已经更新了我对“要“在阻止列表中显示数据,而不是长行”部分的回复,请使用:”来反映您的评论清楚地表明您想要做什么。
      • @ChrisBarsby 如果我的回答解决了你的问题,请选择它作为问题的答案。
      猜你喜欢
      • 2019-04-03
      • 2018-10-31
      • 2013-08-24
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 2013-08-11
      相关资源
      最近更新 更多