从 PHP 中的 csv 数据中提取列


Extract column from csv data in PHP

PHP csv数据,如下所示(注意,它是带有换行符的文本,而不是文件):

$data = 'A,B,C,D,E,F,G,H
    1,1,2014-12-10,5,1,2,0,2
    2,7,2014-12-09,9,0,,7,2';

如何将列提取为排除标题的数组?例如,如果我想提取第 4 列,它将包括 5 和 9。

更新:我试过了

$te = array_column($data,'D');

我收到错误:Warning: array_column() expects parameter 1 to be array,

您可以使用

str_getcsv()将每一行作为数组读取(丢弃第一行以跳过标题)。然后只需保留相关列,例如:

$lines = preg_split("/(?:'r?'n|'r'n?)/", $data); // Split lines
array_shift($lines);                             // Discard header
$result = array();
foreach ($lines as $csv) {
    $row = str_getcsv($csv);
    $result[] = $row[3];
}
var_dump($result);

根据下面评论中的cHao建议,如果您需要对通用CSV数据提供更强大的支持,则可以将字符串转储到虚拟文件中并改用fgetcsv()(它已经正确处理了多行输入的解析):

$fp = fopen('php://temp', 'r+');
fputs($fp, $data);
fseek($fp, 0);
$result = array();
fgetcsv($fp);
while (false != ($row = fgetcsv($fp))) {
    $result[] = $row[3];
}
fclose($fp);
var_dump($result);

如果这是一个逗号分隔的字符串,在这种情况下可以使用str_getcsv()

// load the string and explode, then apply str_getcsv
$data = array_map('str_getcsv', explode("'n", $request->getResponseBody()));
array_shift($data); // remove the header
$fourth_column = array();
foreach($data as $line) {
    if(!empty($line[3])) {
        $fourth_column[] = $line[3]; // indices start at zero
    }   
}