Search code examples
phparrayssortinglimiting

Limiting and Ordering Values in Array


Using some code from NHTSA's API, my own and ideas from this site, wrapping it into a function, it is working just fine but would not run on my live server.

On the live server, it was giving an error which I finally solved to the code using an array shortcut not supported by my live server's PHP version:

Parse error: syntax error, unexpected '[', expecting ')' in /home/pchome/public_html/verify/functions/sitefunctions.php on line 9

which is this line:

$postdata = http_build_query(["data" => $VINS, "format" => "JSON"]);

Changed to this it works and also changed similar code in several other places in the same manner:

$postdata = http_build_query(array("data" => $VINS, "format" => "JSON"));

Occasionally (but not always) I may want to pass multiple VINs to it as a semicolon-separated list. This format is not changeable so what is needed to give this functionality? (Sample VINs: 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;
}

. . . and it is outputting something like this:

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 

Solution

  • All working now so here is the final version! As needed, shows only rows with values and can handle multiple VINs in one submission. The function is called from a simple form that has a textarea for entering the VINs, along with a Submit button.

    // Uses NHTSA API to decode VIN(s)
    function decodeVINS($VINS) {
        // sample VINs 3GNDA13D76S000000;5XYKT3A12CG000000
        if ($VINS) :
            $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);
            $returnValue = json_decode(@stream_get_contents($fp),TRUE);
            if(!isset($returnValue['Results'])):
                echo "Invalid return data or no return data. Exiting";
                return FALSE;
            endif;
            $results = $returnValue['Results'];
    
            if(!is_array($results)):
                $results = array($results);
            endif;
    
            $output = '';
            foreach($results as $result):
                $output .= "<blockquote>\n";
                $output .= "<div><strong>VIN: {$result['VIN']}</strong></div>\n";
                $output .= "<div><strong>ErrorCode: {$result['ErrorCode']}</strong></div>\n";
    
                if ($result['AdditionalErrorText']) :
                    $output .= "<div><strong>AdditionalErrorText: {$result['AdditionalErrorText']}</strong></div>\n";
                endif;
    
                foreach ($result as $key => $val) :
                    if ($val && $key != "VIN" && $key != "ErrorCode" && $key != "AdditionalErrorText") :
                        $output .= "<div>$key: $val</div>";
                    endif;
                endforeach;
                $output .= "</blockquote>\n\n";
            endforeach;
        else :
            $output = "Enter VINs above separated by line breaks";
        endif;
    
        return $output;
    }