从PHP中的csv数据中提取列

时间:2014-12-11 03:20:37

标签: php arrays csv

我在csv中有PHP个数据,如下所示(注意,它的文字中包含换行符号,而不是文件):

$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,

2 个答案:

答案 0 :(得分:2)

您可以使用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);

答案 1 :(得分:1)

如果这是逗号分隔的字符串,则在这种情况下可以使用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
    }   
}