在 PHP 開發中,CSV(逗號分隔值)文件是數據交換的常用格式。PHP 內建的 fputcsv() 和 fgetcsv() 函數提供了高效處理 CSV 數據的能力。本文將詳細介紹如何使用這些函數進行 CSV 文件的寫入、讀取以及字符串輸出操作。
fputcsv() 函數將一維數組格式化為 CSV 格式並寫入文件指針。函數成功時返回寫入的字符數,失敗返回 false。
<?php
$test_array = array(
array("111","sdfsd","sdds","43344","rrrr"),
array("sssssssss","gdfgfd","232323","wwewe","dsfds"),
array("fgfg","e4343","dsfds","w2332","xcvxc"),
array("11212","2323","344343","344343","rerreer"),
array("fds","43344444","33333333","ttttttt","gggggggggggg"),
array("kdfs","dsfdsfds","wewewe","sdsdddddddd","wwwwwwwwwww")
);
$file = fopen("test.csv", "w") or die("無法打開 test.csv");
foreach ($test_array as $line_array) {
$isSuccess = fputcsv($file, $line_array);
print $isSuccess . "<br>";
if ($isSuccess === false) {
die("無法寫入 CSV 行: " . print_r($line_array, true));
}
}
fclose($file) or die("無法關閉文件 test.csv");
?>
上述代碼會創建一個包含六行五列數據的 test.csv 文件。
有時我們不需要寫入物理文件,而是直接獲取 CSV 格式的字符串。這可以通過 php://output 流配合輸出緩衝區實現:
<?php
$test_array = array(
array("111","sdfsd","sdds","43344","rrrr"),
array("sssssssss","gdfgfd","232323","wwewe","dsfds"),
array("fgfg","e4343","dsfds","w2332","xcvxc"),
array("11212","2323","344343","344343","rerreer"),
array("fds","43344444","33333333","ttttttt","gggggggggggg"),
array("kdfs","dsfdsfds","wewewe","sdsdddddddd","wwwwwwwwwww")
);
ob_start();
$file = fopen("php://output", "w") or die("無法打開輸出流");
foreach ($test_array as $line_array) {
$isSuccess = fputcsv($file, $line_array);
if ($isSuccess === false) {
die("無法寫入 CSV 行: " . print_r($line_array, true));
}
}
fclose($file);
$result = ob_get_contents();
ob_end_clean();
// $result 現在包含完整的 CSV 格式字符串
echo $result;
?>
fgetcsv() 從文件指針讀取一行並解析為數組。其參數說明如下:
函數返回解析後的數組,錯誤或到達文件末尾返回 false。
<?php
$file = fopen('test.csv', 'r') or die("無法打開文件 test.csv");
$color = "#ff0000";
print '<table border="1">';
while ($csv_line = fgetcsv($file)) {
print "<tr>";
$len = count($csv_line);
for ($i = 0; $i < $len; $i++) {
if ($i % 2 == 0) $color = "#cccccc";
else $color = "#999999";
print '<td bgcolor="' . $color . '">' . htmlentities($csv_line[$i]) . '</td>';
}
print "</tr>";
}
print '</table>';
fclose($file) or die("無法關閉文件 test.csv!");
?>
mb_convert_encoding() 轉換掌握 fputcsv() 和 fgetcsv() 將大大提升 PHP 處理結構化數據的效率,特別是在數據導入導出、報表生成等場景中。