【发布时间】:2018-08-19 08:01:27
【问题描述】:
使用 NHTSA 的 API 中的一些代码、我自己的代码和来自该站点的想法,将其包装成一个函数,它工作得很好,但不能在我的实时服务器上运行。
在实时服务器上,它给出了一个错误,我最终使用我的实时服务器的 PHP 版本不支持的数组快捷方式解决了代码:
解析错误:语法错误,第 9 行 /home/pchome/public_html/verify/functions/sitefunctions.php 中出现意外的 '[',期待 ')'
这是这一行:
$postdata = http_build_query(["data" => $VINS, "format" => "JSON"]);
改成这个它可以工作,并且以相同的方式在其他几个地方更改了类似的代码:
$postdata = http_build_query(array("data" => $VINS, "format" => "JSON"));
有时(但并非总是)我可能希望将多个 VIN 作为分号分隔的列表传递给它。这种格式是不可改变的,那么需要什么来提供这个功能呢? (示例 VIN:3GNDA13D76S000000;5XYKT3A12CG000000
// Uses NHTSA API to decode VIN(s)
function decodeVINS($VINS) {
if ($VINS) :
$return = "";
$postdata = http_build_query(array("data" => $VINS, "format" => "JSON"));
$stream_options = array(
'http' => array(
'header' => "Content-Type: application/x-www-form-urlencoded\r\n".
"Content-Length: ".strlen($postdata)."\r\n",
'method' => "POST",
'content' => $postdata
)
);
$context = stream_context_create($stream_options);
$apiURL = "https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/";
$fp = @fopen($apiURL, 'rb', FALSE, $context);
$results = array_column(json_decode(@stream_get_contents($fp),TRUE), '0');
$results = $results[0];
$output = "<blockquote>\n";
$output .= "<div><strong>VIN: {$results['VIN']}</strong></div>\n";
$output .= "<div><strong>ErrorCode: {$results['ErrorCode']}</strong></div>\n";
if ($results['AdditionalErrorText']) :
$output .= "<div><strong>AdditionalErrorText: {$results['AdditionalErrorText']}</strong></div>\n";
endif;
foreach ($results as $key => $val) :
if ($val && $key != "VIN" && $key != "ErrorCode" && $key != "AdditionalErrorText") :
$output .= "<div>$key: $val</div>";
endif;
endforeach;
$output .= "</blockquote>\n\n";
else :
$output = "Enter VINs above separated by line breaks";
endif;
return $output;
}
。 . .它正在输出如下内容:
VIN: JB7FJ43S5KJ000911
ErrorCode: 0 - VIN decoded clean. Check Digit (9th position) is correct
BodyClass: Sport Utility Vehicle (SUV)/Multi Purpose Vehicle (MPV)
DisplacementCC: 3000
DisplacementCI: 183.0712322841
DisplacementL: 3
DriveType: 4WD/4-Wheel Drive/4x4
EngineConfiguration: V-Shaped
EngineCylinders: 6
FuelTypePrimary: Gasoline
GVWR: Class 1C: 4,001 - 5,000 lb (1,814 - 2,268 kg)
Make: DODGE
Manufacturer: MITSUBISHI MOTORS CORPORATION (MMC)
ManufacturerId: 1052
Model: Raider
ModelYear: 1989
PlantCity: Nagoya
PlantCompanyName: Nagoya #3
PlantCountry: Japan
VehicleType: TRUCK
【问题讨论】:
-
请向我们提供来自
$response的数据,您当前的输出是什么,为什么它不正确,以及您想要的确切输出是什么。foreach()...块似乎应该在if ($response === FALSE) :条件块的else部分中。或者更简洁:if (!$response = csv2Array(@stream_get_contents($fp))) {... return ... } else { foreach () ...} -
if (!$fp) :也应该是早期的return。 -
我用 $response 的原始输出更新了我原来的问题,这不是我想的那样。现在的工作方式,它给了我我想要的一切,但它实际上给了太多而且顺序错误。当我只需要 $showfields 中的那些时,它会显示所有可能的值,事实上,我根本不需要任何空的(那些在 : 右侧没有任何内容的值)。因此,API 提供的数组似乎需要在 : 处修改并拆分为一个新数组,但不幸的是,我对这种类型的数组操作太没教养了!
-
...等等,等等,等等。您是否接收 JSON 并将其视为 CSV?您可以接收 CSV 数据吗?您需要决定要使用哪种数据结构。在我看来,
csv2Array()正在破坏您的 JSON 数据。我可以帮你,但我们需要让公共汽车倒车一点。请提供来自@stream_get_contents($fp)的样本数据,并从该数据中,请显示该输入的确切期望输出。我应该能够弄清楚这两点之间的过程。 -
JSON 是传递给函数的参数,但我不相信它实际上在做任何事情。无论如何,我会尝试发布所要求的信息。
标签: php arrays sorting limiting