消除API输出数据中的换行符

时间:2018-08-20 22:08:47

标签: php html api line-breaks

我是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';
  }




?>

2 个答案:

答案 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)

  1. 如果没有要显示的值,请不要理会新的键名或单位值。
  2. 通过将数据存储在新的/过滤的/准备好的结果数组中,您可以更好地控制<br />标记-这样可以避免在输出的最后一行之后写入break标记。 (更干净的dom)
  3. 我建议您使用包含div和样式的方式在输出中创建空格,而不要使用多个<br />标签。
  4. 使用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>