我是API集成和PHP的新手。我最近将VIN解码器集成到我的应用中。在输入框中输入车辆的VIN,单击提交,然后返回有关该车辆的信息。
问题是某些车辆返回的数据比其他车辆多。 VIN的Audi A4:WAUBFAFL6FA058452返回所有字段的数据。但是,保时捷911(VIN:WP0AB29954S696067)仅返回某些字段的数据。
这是输出的样子。
奥迪A4:
VIN: WAUBFAFL6FA058452
Engine-
Engine Displacement 1: 2 liters
Engine Displacement 2: 1984 cc's
Engine Displacement 3: 121.071108283 ci's
Engine Size: 4 cylinders
Horsepower: 220 hp
Kilowatts: 164.0540 kw
Engine Manufacturer: Audi
Engine Model: Flex Fuel Capable engine
Primary Fuel Type: Gasoline
Secondary Fuel Type: Ethanol (E85)
保时捷911:
VIN: WP0AB29954S696067
Engine-
Engine Displacement 1: 3.6 liters
Engine Displacement 2: 3600.0 cc's
Engine Displacement 3: 219.68547874103 ci's
Engine Size: 6 cylinders
Horsepower: 415 hp
Kilowatts: 309.4655 kw
Primary Fuel Type: Gasoline
我想做的是消除由空数据字段引起的数据空白。由于没有“发动机制造商和发动机型号”的数据,因此输出数据中存在间隙。如何消除这种差距?因此,保时捷911的期望输出如下所示:
所需的保时捷输出:
VIN: WP0AB29954S696067
Engine-
Engine Displacement 1: 3.6 liters
Engine Displacement 2: 3600.0 cc's
Engine Displacement 3: 219.68547874103 ci's
Engine Size: 6 cylinders
Horsepower: 415 hp
Kilowatts: 309.4655 kw
Primary Fuel Type: Gasoline
这是我的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);
$data = array();
foreach ($json['Results'][0] as $k => $v){
if ($k == "DisplacementCC"){
$k = "Engine Displacement 2";
}
if ($k == "DisplacementCI"){
$k = "Engine Displacement 3";
}
if ($k == "DisplacementL"){
$k = "Engine Displacement 1";
$v = round($v,1);
}
if ($k == "EngineKW"){
$k = "Kilowatts";
}
if ($k == "EngineManufacturer"){
$k = "Engine Manufacturer";
}
if ($k == "EngineModel"){
$k = "Engine Model";
}
if ($k == "FuelTypePrimary"){
$k = "Primary Fuel Type";
}
if ($k == "FuelTypeSecondary"){
$k = "Secondary Fuel Type";
}
if ($k == "EngineHP"){
$k = "Horsepower";
}
if ($k == "EngineCylinders"){
$k = "Engine Size";
}
if (!empty($v)) {
$data[$k] = ($k).": ".($v);
}
}
echo $data['VIN'].'<br /><br/>';
echo "Engine-".'<br /><br />';
echo $data['Engine Displacement 1']. " liters". '<br />';
echo $data['Engine Displacement 2']. " cc's". '<br />';
echo $data['Engine Displacement 3']. " ci's". '<br />';
echo $data['Engine Size']. " cylinders". '<br />';
echo $data['Horsepower']." hp". '<br />';
echo $data['Kilowatts']." kw". '<br />';
echo $data['Engine Manufacturer']. '<br />';
echo $data['Engine Model']. '<br />';
echo $data['Primary Fuel Type']. '<br />';
echo $data['Secondary Fuel Type']. '<br /><br />';
}
else {
echo 'No Vin Inputted';
}
?>
答案 0 :(得分:3)
最简单的方法是创建一个小的实用程序函数,如果定义了每个指标,则可以选择打印该指标:
<?php
function print_if_not_empty(array &$arr, $key, $suffix = '') {
if (!empty($arr[$key])) {
echo $arr[$key] . ' ' . $suffix . '<br />';
}
}
然后您将这样称呼它:
print_if_not_empty($data, 'Engine Displacement 1', "liters");
print_if_not_empty($data, 'Engine Displacement 2', "cc's");
print_if_not_empty($data, 'Engine Displacement 3', "ci's");
print_if_not_empty($data, 'Engine Size', "cylinders");
print_if_not_empty($data, 'Horsepower', "hp");
print_if_not_empty($data, 'Kilowatts', "kw");
print_if_not_empty($data, 'Engine Manufacturer');
print_if_not_empty($data, 'Engine Model');
print_if_not_empty($data, 'Primary Fuel Type');
print_if_not_empty($data, 'Secondary Fuel Type');
echo '<br/>';
print_if_not_empty
函数接受一个数组,该数组中的一个键以及一个可选的后缀。它检查以确保键存在于数组中,并且该键不为空,如果存在,它将打印具有指定后缀的值。如果它不在数组中,或者它为空,则不打印任何内容。
答案 1 :(得分:0)
<br />
标记-这样可以避免在输出的最后一行之后写入break标记。 (更干净的dom)<br />
标签。elseif
语句,以便您在找到$k
匹配项后不必检查后续条件。代码:
foreach ($json['Results'][0] as $k => $v){
if (strlen($v)) { // only bother to process this element if it contains a value with a positive length
if ($k == "DisplacementCC") {
$results[] = "Engine Displacement 2: $v cc's";
} elseif ($k == "DisplacementCI") {
$results[] = "Engine Displacement 3: $v ci's";
} elseif ($k == "DisplacementL") {
$results[] = "Engine Displacement 1: " . round($v, 1) . " liters";
} elseif ($k == "EngineKW") {
$results[] = "Kilowatts: $v kw";
} elseif ($k == "EngineManufacturer") {
$results[] = "Engine Manufacturer: $v";
} elseif ($k == "EngineModel") {
$results[] = "Engine Model: $v";
} elseif ($k == "FuelTypePrimary") {
$results[] = "Primary Fuel Type: $v";
} elseif ($k == "FuelTypeSecondary") {
$results[] = "Secondary Fuel Type: $v";
} elseif ($k == "EngineHP") {
$results[] = "Horsepower: $v hp";
} elseif ($k == "EngineCylinders") {
$results[] = "Engine Size: $v cylinders";
}
}
}
echo "<div id=\"VIN\">{$json['Results'][0]['VIN']}</div>";
echo "<div id=\"EngineDetails\">";
echo "Engine-<br /><br />";
echo implode("<br />", $results);
echo "</div>";
输出:
<div id="VIN">WAUBFAFL6FA058452</div>
<div id="EngineDetails">
Engine-<br /><br />
Engine Displacement 2: 1984 cc's<br />
Engine Displacement 3: 121.071108283 ci's<br />
Engine Displacement 1: 2 liters<br />
Engine Size: 4 cylinders<br />
Horsepower: 220 hp<br />
Kilowatts: 164.0540 kw<br />
Engine Manufacturer: Audi<br />
Engine Model: Flex Fuel Capable engine<br />
Primary Fuel Type: Gasoline<br />
Secondary Fuel Type: Ethanol (E85)
</div>