把数组转成csv格式的文件,以及从csv格式的文件读入都有php的内置函数支持fgetcsv/fputcsv
读入一个csv格式的字符串也有str_getcsv可以办到,那么我想把一个数组变成csv格式的字符串呢?php里没有这样的函数。
参考csv的数据格式定义,我们可以自己简单写个函数实现这个功能。
<?php
class CsvHelper {
/**
* 转义成csv个格式的字段,用双引号包裹
*/
public static function escapesToCsv($row, $enclosure) {
switch (gettype($row)) {
case "NULL":
$field = '';
break;
case "boolean":
$field = ($row == true) ? 'true': 'false';
break;
case "integer":
case "double":
$field = $row;
break;
case "string":
$field = str_replace('"', '""', $row);
break;
case "object":
case "resource":
default:
$field = '';
break;
}
return $enclosure.$field.$enclosure;
}
public static function strPutCsv($array, $delimiter = ',', $enclosure = '"', $terminator = "\n") {
$fieldArray = array();
foreach ($array as $key => $value) {
if(is_array($value)) {
$fieldArray[] = strPutCsv($value, $delimiter, $enclosure, ""); //中间的数组转换成csv,行分割符为空
}else{
$fieldArray[] = self::escapesToCsv($value, $enclosure);
}
}
return implode($delimiter, $fieldArray).$terminator;
}
public static function strGetCsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\') {
return str_getcsv($input, $delimiter, $enclosure, $escape);
}
}
测试
$array = array(1, true, false, 'h\\\\e\llo', 'word,o', 'hello"php');
$str = CsvHelper::strPutCsv($array);
echo $str;
$arr = CsvHelper::strGetCsv($str);
var_dump($array);
输出
"1","true","false","h\\e\llo","word,o","hello""php"
array(6) {
[0]=>
int(1)
[1]=>
bool(true)
[2]=>
bool(false)
[3]=>
string(8) "h\\e\llo"
[4]=>
string(6) "word,o"
[5]=>
string(9) "hello"php"
}