fgetcsv()

1. 定义

从文件指针处读取一行字符,直到遇到换行符、文件末尾或者函数参数列表中指定的长度($length - 1)后停止,并对行中的CSV字段进行解析。 如果没有指定length,则默认为1024字节。

读取成功时返回解析后的CSV字段数组,文件指针后没有多余的数据或者读取失败则返回FALSE。

2. 语法

fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\\' ]]]] ) : array

3. 参数说明

参数 可选性 数据类型 描述
$handle 必需 资源类型 文件句柄,通过fopen()函数打开的文件资源
$length 可选 整型 规定要输出的字符串的字节数
$delimiter 可选 字符串 字段分界符,只允许一个字符,默认为逗号,
$enclosure 可选 字符串 字段环绕符,只允许一个字符,默认为双引号"
$escape 可选 字符串 转义字符,只允许一个字符,默认为反斜杠\\

4. 示例

<?php

// fgetcsv()
// 从文件指针处读取一行字符,直到遇到换行符、文件末尾或者函数参数列表中指定的长度($length - 1)后停止,并对行中的`CSV`字段进行解析

$csv = <<<CSV
"哪吒之魔童降世","8.5","https://movie.douban.com/subject/26794435/","https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2563780504.jpg"
"我不是药神","9","https://movie.douban.com/subject/26752088/","https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2561305376.jpg"
"续命之徒:绝命毒师电影","8.3","https://movie.douban.com/subject/30372377/","https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2569548689.jpg"
"肖申克的救赎","9.7","https://movie.douban.com/subject/1292052/","https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg"
"这个杀手不太冷","9.4","https://movie.douban.com/subject/1295644/","https://img3.doubanio.com/view/photo/s_ratio_poster/public/p511118051.jpg"
"绿皮书","8.9","https://movie.douban.com/subject/27060077/","https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2549177902.jpg"
CSV;

file_put_contents(__DIR__.'/test.txt', $csv);
$handle = fopen(__DIR__.'/test.txt', 'w');
fwrite($handle, $csv, strlen($csv));
fclose($handle);

$handle = fopen(__DIR__.'/test.txt', 'r');
$arr = fgetcsv($handle, 1000);
var_dump($arr);
/* 输出:
array(4) {
  [0]=>
  string(21) "哪吒之魔童降世"
  [1]=>
  string(3) "8.5"
  [2]=>
  string(42) "https://movie.douban.com/subject/26794435/"
  [3]=>
  string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2563780504.jpg"
}
*/
fclose($handle);

$handle = fopen(__DIR__.'/test.txt', 'r');
$arr = [];
while (!feof($handle)) {
    $arr[] = fgetcsv($handle, 1000);
}
var_dump($arr);
/* 输出:
array(6) {
  [0]=>
  array(4) {
    [0]=>
    string(21) "哪吒之魔童降世"
    [1]=>
    string(3) "8.5"
    [2]=>
    string(42) "https://movie.douban.com/subject/26794435/"
    [3]=>
    string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2563780504.jpg"
  }
  [1]=>
  array(4) {
    [0]=>
    string(15) "我不是药神"
    [1]=>
    string(1) "9"
    [2]=>
    string(42) "https://movie.douban.com/subject/26752088/"
    [3]=>
    string(74) "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2561305376.jpg"
  }
  [2]=>
  array(4) {
    [0]=>
    string(33) "续命之徒:绝命毒师电影"
    [1]=>
    string(3) "8.3"
    [2]=>
    string(42) "https://movie.douban.com/subject/30372377/"
    [3]=>
    string(74) "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2569548689.jpg"
  }
  [3]=>
  array(3) {
    [0]=>
    string(24) "肖申克的救赎",9.7""
    [1]=>
    string(41) "https://movie.douban.com/subject/1292052/"
    [2]=>
    string(73) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg"
  }
  [4]=>
  array(4) {
    [0]=>
    string(21) "这个杀手不太冷"
    [1]=>
    string(3) "9.4"
    [2]=>
    string(41) "https://movie.douban.com/subject/1295644/"
    [3]=>
    string(73) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p511118051.jpg"
  }
  [5]=>
  array(4) {
    [0]=>
    string(9) "绿皮书"
    [1]=>
    string(3) "8.9"
    [2]=>
    string(42) "https://movie.douban.com/subject/27060077/"
    [3]=>
    string(74) "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2549177902.jpg"
  }
}
*/

fclose($handle);

5. 延展阅读

  • str_getcsv():将一个csv格式的字符串解析到一个数组中,返回含有该csv字段值的数组
  • explode():使用一个字符串分割另一个字符串,返回被分割后子字符串组成的数组
  • file():将文件读入数组。返回以文件行号为索引的数组
  • fputcsv():将一个数组格式化为CSV后写入通过函数fopen()打开的文件句柄