2

我的服务器上运行了一个 Python 脚本,它创建了一个像这样的 2D 列表:

[['Header1', 'Header2', 'Header3'], ['2012-09-10 00:11:00', '61.3', '57.0'], ...]

我将它传递回运行我的网页的 PHP 脚本。这是我目前用来获取数组的 PHP。我得到了行,但显然[[在开始和]]结束时都有不需要的行。

exec("python weatherdata.py $stationID $startdate $enddate", $pyoutput);
$vars = explode("], [", $pyoutput[0]);

为了解释我真正想要做的事情,因为肯定会有一个“正确”的解决方案(我对 PHP 一点也不熟悉),我想要做的是调整从这里下载 CSV 文件的代码给用户,但使用 mySQL 来填充它。这里的设置部分工作正常。

针对下面杰克的回答进行了编辑

// Commented out my working parsing part
// remove the start and end square braces then split into rows
//$output = str_replace("[[","",$pyoutput);
//$output = str_replace("]]","",$output);
//$rows = explode("], [", $output[0]);

// output headers so that the file is downloaded rather than displayed
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename='data.csv');

// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');

foreach (preg_split('/],\s*\[/', trim($pyoutput, '[]')) as $row) {
        $data= preg_split("/',\s*'/", trim($row, "'"));
        fputcsv($data);
}
// Commented out my working write to CSV part
// write rows
//foreach ($rows as $row){
//    $row = str_replace("'","",$row);
//    $row = explode(",", $row);
//    fputcsv($output, $row);
//}
4

1 回答 1

4

不确定这对您是否可行,但从 PHP 5.4 开始,它支持短数组语法,例如,[1, 2, 3]而不是array(1, 2, 3).

所以,你可以只使用邪恶......我的意思是eval()

$vars = eval(`python weatherdata.py $stationID $startdate $enddate`);

否则,如果数组语法始终采用该格式,只需用 将其分开preg_split(),首先在方括号中,然后在单引号中:

foreach (preg_split('/],\s*\[/', trim($s, '[]')) as $row) {
        $data = preg_split("/',\s*'/", trim($row, "'"));
        print_r($data);
}

输出:

Array
(
    [0] => Header1
    [1] => Header2
    [2] => Header3
)
Array
(
    [0] => 2012-09-10 00:11:00
    [1] => 61.3
    [2] => 57.0
)
于 2012-12-14T13:39:15.517 回答