【问题标题】:Eliminating line breaks in API output data消除 API 输出数据中的换行符
【发布时间】:2018-08-20 22:08:47
【问题描述】:

我是 API 集成和 PHP 的新手。我最近在我的应用程序中集成了一个 VIN 解码器。在输入框中输入车辆的VIN,点击提交,返回该车辆的相关信息。

问题是某些车辆返回的数据比其他车辆多。奥迪 A4,VIN: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';
  }




?>

【问题讨论】:

  • 只能说你对样车的品味还不错:)
  • 我不是已经回答了吗? stackoverflow.com/a/51903267/2943403 您可以将 $units 字符串添加到以相同方式实现的另一个查找数组中。

标签: php html api line-breaks


【解决方案1】:

最简单的做法是创建一个小实用程序函数,如果定义了每个指标,它可以选择性地打印它:

<?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 函数接受一个数组、该数组的键和一个可选的后缀。它检查以确保该键存在于数组中并且它不为空,如果是,它会打印具有指定后缀的值。如果它不在数组中或者它是空的,它什么也不打印。

【讨论】:

  • 似乎工作得很好!你能告诉我你创建的功能吗?它到底在说什么。
  • 这很简单,但我更新了一个解释。
【解决方案2】:
  1. 如果没有可显示的值,请不要使用新的键名或单位值。
  2. 通过将数据存储在一个新的/过滤的/准备好的结果数组中,您可以更好地控制&lt;br /&gt; 标签——这避免了在输出的最后一行之后写入中断标签。 (更清洁的 dom)
  3. 我建议您使用包含 div 和样式在输出中创建空格,而不是使用多个 &lt;br /&gt; 标记。
  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>

【讨论】:

  • 再次感谢您的见解。为样式目的添加 div 很有帮助。如果我要在echo "Engine-&lt;br /&gt;&lt;br /&gt; 下添加一个名为echo "General-&lt;br /&gt;&lt;br /&gt; 的类别,其中包含有关汽车品牌、型号和年份的数据,我不确定echo implode&lt;"br /&gt;, $results); 是否允许添加。我可以看到将所有数据分组到$results 限制格式化。你怎么看?再次感谢您的帮助!
  • 当我阅读更多您的问题时(所有问题都非常相似,只有微小的变化),我对您想要实现的目标有了更好的了解。问题是,我需要回答每个页面上发布的问题,因为未来的研究人员不能被要求阅读您的其他问题以更好地了解您的要求和数据。有几种技术可用于显示所需的输出。我只是想通过稳定/直接的方法解决您的问题。
  • 这个答案:stackoverflow.com/a/51940764/2943403 为您的输出分组和编写提供了更深思熟虑的解决方案。
  • 注意到了。下次我将尽我所能将我的所有要求绑定到一个查询中。再次感谢!
  • 请努力将您的所有问题转移到系统认可的解决方案上。 (例如绿色勾号、页面关闭、页面删除)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多