【问题标题】:Changing the Layout of API Data Output更改 API 数据输出的布局
【发布时间】:2019-01-24 17:20:40
【问题描述】:

我是 API 集成和 PHP 的新手。我最近在我的应用程序中集成了一个 VIN 解码器。在输入框中输入车辆的 VIN,选择提交,API 数据库中有关该车辆的所有信息都会显示出来。

数据存储为关联数组,包含类别及其对应元素。例如对于 VIN:WAUBFAFL6FA058452 类别之一是制造,其元素是奥迪。

一些 VIN 比其他 VIN 携带更多的数据。我只希望在选择提交时显示带有数据的类别。所以在一些帮助下,我添加了这行代码:

foreach ($json['Results'][0] as $k => $v){
  if (!empty($v)) {
    $results .= ($k).": ".($v).'<br />';
  }
}

我的下一个障碍是获取输出、类别及其元素,并组织/格式化它们,同时保持我上面定义的逻辑。我只想显示带有数据的类别。

我不确定如何定位单个类别来格式化它们。目前,输出按字母顺序显示。我想定义自己的输出布局。

电流输出:

AirBagLocCurtain: All Rows
AirBagLocFront: 1st Row (Driver & Passenger)
AirBagLocSide: 1st Row (Driver & Passenger)
BodyClass: Sedan/Saloon
DisplacementCC: 1984
DisplacementCI: 121.071108283
DisplacementL: 1.984000
And so on....

如何更改此布局?我希望将输出布局更改为以下内容。

期望的输出:

VIN: WAUBFAFL6FA058452

General – 
Make: AUDI
ModelYear: 2015
Model: A4
BodyClass: Sedan/Saloon
Doors: 4
Series: Premium quattro
VehicleType: PASSENGER CAR

Safety - 
AirBagLocCurtain: All Rows
AirBagLocFront: 1st Row (Driver & Passenger)
AirBagLocSide: 1st Row (Driver & Passenger)
SeatBeltsAll: Manual

Engine - 
DisplacementCC: 1984
DisplacementCI: 121.071108283
DisplacementL: 1.984000
EngineCylinders: 4
EngineHP: 220
EngineKW: 164.0540
EngineManufacturer: Audi
EngineModel: Flex Fuel Capable engine
TransmissionStyle: Automatic
OtherEngineInfo: Fuel: Gas (50-St); Federal / California Emission        Standard: BIN 5 / ULEV II; Emissions Certification Test Group: FVGAV02.0AUB / FVGAJ02.0AUF E85
FuelTypePrimary: Gasoline
FuelTypeSecondary: Ethanol (E85)

Factory - 
Manufacturer: AUDI
ManufacturerId: 1149
PlantCity: Ingolstadt
PlantCountry: Germany

Other - 
ErrorCode: 0 - VIN decoded clean. Check Digit (9th position) is correct
TPMS: Indirect

这是我的html代码,只是输入栏和提交按钮:

<!DOCTYPE html>
<html>

<head>
<title>VIN Decoder API Test</title>

<style type="text/css">
input,button {width: 200px;display: block;margin-left: auto;margin-right: auto;}
button {width: 100px;background-color: darkgray;}
</style>

</head>

<body>

    <form action="processvin3.php" method="post">

    <input type="text" id="b12" placeholder="Enter VIN" name="b12" maxlength="100"/>
    <br>
    <button id="submit_btn">Submit</button>

  </form>

  <br>
  <br>

</body>
</html>

还有我的php代码:

<?php

$vin = $_POST["b12"];

if ($vin) {
    $postdata = http_build_query([
            'format' => 'json',
            'data' => $vin
        ]
    );
    $opts = [
        'http' => [
            'method' => 'POST',
            'content' => $postdata
        ]
    ];

    $apiURL = "https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/";
    $context = stream_context_create($opts);
    $fp = fopen($apiURL, 'rb', false, $context);
    $line_of_text = fgets($fp);
    $json = json_decode($line_of_text, true);
    fclose($fp);

    foreach ($json['Results'][0] as $k => $v){
      if (!empty($v)) {
        $results .= ($k).": ".($v).'<br />';
      }
    }

    echo $results;
  }

    else {
    echo 'No Vin Inputted';
    }




?>

非常感谢任何建议、提示或答案。非常感谢。

【问题讨论】:

  • 我们得到 404 错误

标签: php html arrays api


【解决方案1】:

我建议使用“主”数组来过滤和准备分类分组的数据。更多解释见内联 cmets:

代码:(Demo)

你的主阵列:

$master = [
    "General" => [
        "Make" => "",
        "ModelYear" => "",
        "Model" => "",
        "BodyClass" => "",
        "Doors" => "",
        "Series" => "",
        "VehicleType" => ""
    ],
    "Safety" => [
        "AirBagLocCurtain" => "",
        "AirBagLocFront" => "",
        "AirBagLocSide" => "",
        "SeatBeltsAll" => ""
    ],
    "Engine" => [
        "DisplacementCC" => "",
        "DisplacementCI" => "",
        "DisplacementL" => "",
        "EngineCylinders" => "",
        "EngineHP" => "",
        "EngineKW" => "",
        "EngineManufacturer" => "",
        "EngineModel" => "",
        "TransmissionStyle" => "",
        "OtherEngineInfo" => "",
        "FuelTypePrimary" => "",
        "FuelTypeSecondary" => ""
    ],
    "Factory" => [
        "Manufacturer" => "",
        "ManufacturerId" => "",
        "PlantCity" => "",
        "PlantCountry" => ""
    ],
    "Other" => [
        "ErrorCode" => "",
        "TPMS" => ""
    ]
];

处理:

foreach ($master as $category => &$items) {  // allow modification of $master data with &
    foreach ($items as $k => &$v) {          // allow modification of $master data with &
        if (isset($json['Results'][0][$k]) && strlen($json['Results'][0][$k])) {  // only bother to process/display desired keys and non-empty values
            $new = $json['Results'][0][$k];
            if ($k == "DisplacementCC") {
                $v = "Engine Displacement 2: $new cc's";
            } elseif ($k == "DisplacementCI") {
                $v = "Engine Displacement 3: $new ci's";
            } elseif ($k == "DisplacementL") {
                $v = "Engine Displacement 1: " . round($new, 1) . " liters";
            } elseif ($k == "EngineKW") {
                $v = "Kilowatts: $new kw";
            } elseif ($k == "EngineManufacturer") {
                $v = "Engine Manufacturer: $new";
            } elseif ($k == "EngineModel") {
                $v = "Engine Model: $new";
            } elseif ($k == "FuelTypePrimary") {
                $v = "Primary Fuel Type: $new";
            } elseif ($k == "FuelTypeSecondary") {
                $v = "Secondary Fuel Type: $new";
            } elseif ($k == "EngineHP") {
                $v = "Horsepower: $new hp";
            } elseif ($k == "EngineCylinders") {
                $v = "Engine Size: $new cylinders";
            } else {
                $v = "$k: $new";
            }
        } else {
            unset($master[$category][$k]);  // remove unwanted element from master
        }
    }
}

unset($items, $v);  // just as a precaution to eliminate the referenced variables

echo "<div id=\"VIN\">{$json['Results'][0]['VIN']}</div>\n\n";
// now iterate the updated $master multi-dimensional array and only display the "good stuff"
foreach ($master as $category => $items) {
    if (!empty($items)) {  // only display categories & rows of data when the category holds 1 or more values
        echo "<div class=\"group\">$category -</ br>";
        foreach ($items as $v) {
            echo "<div class=\"row\">$v</div>";
        }
        echo "</div>";
    }
}

输出:

<div id="VIN">WAUBFAFL6FA058452</div>

<div class="group">General -</ br>
    <div class="row">Make: AUDI</div>
    <div class="row">ModelYear: 2015</div>
    <div class="row">Model: A4</div>
    <div class="row">BodyClass: Sedan/Saloon</div>
    <div class="row">Doors: 4</div>
    <div class="row">Series: Premium quattro</div>
    <div class="row">VehicleType: PASSENGER CAR</div>
</div>

<div class="group">Safety -</ br>
    <div class="row">AirBagLocCurtain: All Rows</div>
    <div class="row">AirBagLocFront: 1st Row (Driver & Passenger)</div>
    <div class="row">AirBagLocSide: 1st Row (Driver & Passenger)</div>
    <div class="row">SeatBeltsAll: Manual</div>
</div>

<div class="group">Engine -</ br>
    <div class="row">Engine Displacement 2: 1984 cc's</div>
    <div class="row">Engine Displacement 3: 121.071108283 ci's</div>
    <div class="row">Engine Displacement 1: 2 liters</div>
    <div class="row">Engine Size: 4 cylinders</div>
    <div class="row">Horsepower: 220 hp</div>
    <div class="row">Kilowatts: 164.0540 kw</div>
    <div class="row">Engine Manufacturer: Audi</div>
    <div class="row">Engine Model: Flex Fuel Capable engine</div>
    <div class="row">TransmissionStyle: Automatic</div>
    <div class="row">OtherEngineInfo: Fuel: Gas (50-St); Federal / California Emission Standard: BIN 5 / ULEV II; Emissions Certification Test Group: FVGAV02.0AUB / FVGAJ02.0AUF E85</div>
    <div class="row">Primary Fuel Type: Gasoline</div>
    <div class="row">Secondary Fuel Type: Ethanol (E85)</div>
</div>

<div class="group">Factory -</ br>
    <div class="row">Manufacturer: AUDI</div>
    <div class="row">ManufacturerId: 1149</div>
    <div class="row">PlantCity: Ingolstadt</div>
    <div class="row">PlantCountry: Germany</div>
</div>

<div class="group">Other -</ br>
    <div class="row">ErrorCode: 0 - VIN decoded clean. Check Digit (9th position) is correct</div>
    <div class="row">TPMS: Indirect</div>
</div>

*注意,您可以使用!empty() 而不是isset() 然后strlen(),前提是您知道您永远不会将0 作为有效值。 empty() 会将 0 误认为是“假”/“空”值,并默默地要求从主数组中删除元素。

【讨论】:

  • 真的很喜欢您创建主阵列并从那里开始工作的方式。我怎样才能编辑它,以便 &lt;div class="row"&gt;&lt;/div&gt; 被分成两个 div?我想以不同于AUDI 等数据的方式对Make: 等数据进行样式化/选择。再次感谢您的所有工作和帮助!
  • 我喜欢你思考 DOM 结构的方式。当您从一开始就精心设计时,您将获得更高质量的结果。我想如果您将Make: 字符串和AUDI 字符串保留在同一行,您只需将每个字符串包装在&lt;span&gt; 标签中,并为每个字符串赋予class 属性,如&lt;span class="label"&gt;$k:&lt;/span&gt; &lt;span class="value"&gt;$new&lt;/span&gt;。老实说,有很多方法可以编写代码——尽量保持简单/干净/直接/直观。
  • 嗯,经过一番考虑,我认为我的循环太多了。这是更直接(更少迭代)3v4l.org/eEKRu 我希望这可以帮助您简化项目。
【解决方案2】:

你开了个好头

foreach ($json['Results'][0] as $k => $v){
  if (!empty($v)) {
    $results .= ($k).": ".($v).'<br />';
  }
}

但在您开始打印输出之前,请尝试创建一个您自己的数组,例如

$data = array();
foreach ($json['Results'][0] as $k => $v){
      if (!empty($v)) {
        $data[$k] = $v;
      }
    }

然后,您可以慢慢来并回显您想要的列表。 使用这种简单的方法,希望列表中被空白检查排除的字段非常少。那你就得做点什么了。

echo 'Make: '. $data['Make'] . '<br>';
echo 'ModelYear: '. $data['ModelYear']. '<br>';
echo 'Model: '. $data['Model']. '<br>';
echo 'BodyClass: '. $data['BodyClass']. '<br>';
echo 'Doors: '. $data['Doors']. '<br>';
echo 'Series: '. $data['Series']. '<br>';
echo 'VehicleType: '. $data['VehicleType']. '<br>';

您还可以仅使用键和空白值手动构建所需的数据数组,然后允许您的 foreach 填充它。然后你可以使用另一个 forech 来打印你的数据数组,因为它会按照你想要的顺序。

只是一个建议。希望它可以帮助您在您的过程中走得更远。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多