dongnao1908
dongnao1908
2018-08-20 22:08

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

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条回答

  • download1323 download1323 3年前

    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.

    点赞 评论 复制链接分享
  • dsfykqq3403 dsfykqq3403 3年前
    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>
    
    点赞 评论 复制链接分享

为你推荐