如何使用PHP

时间:2019-02-15 14:52:25

标签: php mysql csv

我正在通过JSON文件在Raspberry Pi上收集ADSB数据;我正在使用某人的PHP代码从JSON文件生成SQL数据库,但是我需要一个csv文件才能将其输入到我开发的分析程序(SPSS)中。 这是创建sql数据库的PHP代码

    // generate sql insert statement per aircraft in range of user set alt_geom/latitude/longitude and optionally according only to hex or flight numbers in hex_code_array.txt and flight_code_array.txt
    #var_dump($hex_code_array); var_dump($flight_code_array); // show arrays for debug
    if ($user_set_array['filter_mode_database'] && $user_set_array['filter_mode_database_limited']) {
        if (($ac_alt_geom != '' && $ac_alt_geom < $user_set_array['max_alt'] && $ac_lat < $user_set_array['max_lat'] && $ac_lat > $user_set_array['min_lat'] && $ac_lon < $user_set_array['max_lon'] && $ac_lon > $user_set_array['min_lon']) && (func_wildcard_search($ac_hex, $hex_code_array, $user_set_array['filter_mode_wildcard']) || ($ac_flight != '' && func_wildcard_search($ac_flight, $flight_code_array, $user_set_array['filter_mode_wildcard'])))) {
            $sql .= "INSERT INTO aircrafts VALUES (NULL, '" . date("Y-m-d G:i:s l", $ac_now) . "', '$ac_now', '$ac_hex', '$ac_flight', '$ac_dist', ";
            $sql .= "'$ac_alt_geom', '$ac_lat', '$ac_lon', '$ac_track', '$ac_gs', '$ac_baro_rate', '$ac_seen_pos', '$ac_seen', ";
            $sql .= "'$ac_rssi', '$ac_messages', '$ac_category', '$ac_squawk', '$ac_alt_baro', '$ac_mlat', '$ac_tisb', '$message_rate');";
            $sql .= PHP_EOL;

随着PHP的发展,我调整了一些代码,这些代码在Stack上的其他位置找到,但没有生成csv文件。我的目标是获取创建sql数组的变量并不断更新csv文件。

 $data= "id,now,hex,flight,distance,altitude,lat,long,track,gs,baro-rate,seen-pos,seen,rasi,messages,category,squark,alt-baro,mlat,tisb,rec-mag-sec\n"; 
$i = 1;
#echo $data;
$data = array(
array(  '$i' ),
array(  '$ac_id' ),
    array(  '$ac_now' ),
array(  '$ac_hex' ),
array(  '$ac_flight' ),
array(  '$ac_distance' ),
array(  '$ac_alt_geom' ),
array(  '$ac_lat' ),
array(  '$ac_long' ),
array(  '$ac_track' ),
array(  '$ac_gs' ),
array(  '$ac_baro_rate' ),
array(  '$ac_seen_pos' ),
array(  '$ac_seen' ),
array(  '$ac_rssi' ),
array(  '$ac_messages' ),
array(  '$ac_category' ),
array(  '$ac_squark' ),
array(  '$ac_alt_baro' ),
array(  '$ac_mlat' ),
array(  '$ac_tisb' ),
array(  '$ac_rec_mag_sec' ),
);
}
function outputCSV($data) {
    $outputBuffer = fopen("php://output", 'w');
    foreach($data as $val) {
        fputcsv($outputBuffer, $val);
    }
    fclose($outputBuffer);
}

$filename = 'aircrafts';
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=($filename).csv");
header("Pragama: no-cache");
hwader("Expires: 0");

outputCSV($data);

1 个答案:

答案 0 :(得分:0)

首先,您似乎正在混合和匹配使用数组的2种独立方法。如果您要使用以逗号分隔的字符串开头的数据,如下所示:

$data= "1,'2019-2-15 12:00:00','#f6F0C1',1040,345,12500,32.1465,80.1263, ...";

然后您可以将$ data转换成这样的数组:

$data = explode(",", $data);

请注意,这样做时,您不是在使用变量名,而是要在csv中使用的实际原始数据。

但是,如果您的数据来自一堆变量,则可以这样声明数组:

$data= array($i, $ac_id, $ac_now, $ac_hex, $ac_flight, $ac_distance, $ac_alt_geom, $ac_lat ...);

值得注意的是,由于$ data数组的每个元素仅是一个值,因此不需要从中构造数组。另外,由于您希望将这些值称为变量,因此您不想将它们放在引号中。如果将它们用引号引起来,它们将被视为字符串而不是变量。

一旦使用了上面合适的方法制作了一个名为$ data的数组,就需要将其推送到CSV文件中。这里要注意的另一件事是,您一次只想在CSV文件中放入一行;因此,您根本不需要循环它。当您有一个数组数组,其中每个子数组代表CSV文件中的一行时,将使用循环。由于您一次只执行一行,因此可以简化代码,如下所示。

function outputCSV($data) {
    $outputBuffer = fopen("php://output", 'w');  
    fputcsv($outputBuffer,$data); 
    fclose($outputBuffer); 
}