Eliminating line breaks in API output data

2019-08-28 05:53发布

I am new to API integration and PHP. I recently integrated a VIN decoder into my app. Enter a vehicle's VIN into the input box, click submit, and information regarding that vehicle is returned.

The issue is some vehicles return more data than others. An Audi A4, VIN: WAUBFAFL6FA058452, returns data for all of the fields. However, a Porsche 911, VIN: WP0AB29954S696067, returns data for only some of the fields.

Here are how the outputs look.

Audi 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)

Porsche 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

What I want to do is eliminate the gap in data caused by empty data fields. Because there is no data for "Engine Manufacturer and Engine Model," there is a gap in the output data. How can I eliminate this gap? The desired output for the Porsche 911 would therefore look like this:

Desired Porsche Output:

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

Here is my php code:

<?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条回答
走好不送
2楼-- · 2019-08-28 06:18
  1. Don't bother with the new key names or unit values if there is no value to display.
  2. By storing the data in a new/filtered/prepared results array, you have better control of the <br /> tags -- this avoids writing a break tag after the last line of output. (cleaner dom)
  3. I suggest that you use containing divs and styling to create spaces in your output rather than multiple <br /> tags.
  4. Use elseif statements so that you aren't needlessly checking subsequent conditions after you've found a $k match.

Code:

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>";

Output:

<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>
查看更多
3楼-- · 2019-08-28 06:19

The easiest thing to do would be to just create a little utility function that optionally prints each metric if it is defined:

<?php
function print_if_not_empty(array &$arr, $key, $suffix = '') {
    if (!empty($arr[$key])) {
        echo $arr[$key] . ' ' . $suffix . '<br />';
    }
}

And then you would call it like this:

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/>';

The print_if_not_empty function takes an array, a key into that array, and an optional suffix. It checks to make sure that the key exists in the array and that it is not empty, and if so it prints the value with the specified suffix. If it’s not in the array or it is and it is empty, it prints nothing.

查看更多
登录 后发表回答