我有几种方法可以从stackoverflow和google将php数组转换为csv字符串。但是我遇到麻烦,如果我想存储01727499452等手机号码,它会保存为没有前0值。 我目前正在使用这段代码: Convert array into csv
任何人都可以帮助我。
Array
[1] => Array
(
[0] => Lalu ' " ; \\ Kumar
[1] => Mondal
[2] => 01934298345
[3] =>
)
[2] => Array
(
[0] => Pritom
[1] => Kumar Mondal
[2] => 01727499452
[3] => Bit Mascot
)
[3] => Array
(
[0] => Pritom
[1] => Kumar Mondal
[2] => 01711511149
[3] =>
)
[4] => Array
(
[0] => Raaz
[1] => Mukherzee
[2] => 01911224589
[3] => Khulna University 06
)
)
我的代码块:
function arrayToCsv( array $fields, $delimiter = ';', $enclosure = '"', $encloseAll = false, $nullToMysqlNull = false ) {
$delimiter_esc = preg_quote($delimiter, '/');
$enclosure_esc = preg_quote($enclosure, '/');
$outputString = "";
foreach($fields as $tempFields) {
$output = array();
foreach ( $tempFields as $field ) {
if ($field === null && $nullToMysqlNull) {
$output[] = 'NULL';
continue;
}
// Enclose fields containing $delimiter, $enclosure or whitespace
if ( $encloseAll || preg_match( "/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field ) ) {
$field = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure;
}
$output[] = $field." ";
}
$outputString .= implode( $delimiter, $output )."\r\n";
}
return $outputString; }
谢谢,
Pritom。
答案 0 :(得分:21)
您可以使用str_putcsv
功能:
if(!function_exists('str_putcsv'))
{
function str_putcsv($input, $delimiter = ',', $enclosure = '"')
{
// Open a memory "file" for read/write...
$fp = fopen('php://temp', 'r+');
// ... write the $input array to the "file" using fputcsv()...
fputcsv($fp, $input, $delimiter, $enclosure);
// ... rewind the "file" so we can read what we just wrote...
rewind($fp);
// ... read the entire line into a variable...
$data = fread($fp, 1048576);
// ... close the "file"...
fclose($fp);
// ... and return the $data to the caller, with the trailing newline from fgets() removed.
return rtrim($data, "\n");
}
}
$csvString = '';
foreach ($list as $fields) {
$csvString .= str_putcsv($fields);
}
关于GitHub的更多信息,这是由@johanmeiring创建的函数。
答案 1 :(得分:18)
这是你需要的吗?
$out = "";
foreach($array as $arr) {
$out .= implode(",", $arr) . "\r\n";
}
它贯穿你的数组,在每个循环上创建一个新行,用“,”分隔数组值。
答案 2 :(得分:2)
你确定这些数字实际上是在没有前导零的情况下保存的吗?您是否在文本编辑器中查看了实际的CSV输出?
如果您刚刚在电子表格应用程序中打开了CSV文件,则很可能是电子表格将您的电话号码解释为数字值,并在显示时丢弃零。您通常可以通过更改特定列上的格式选项来修复电子表格中的内容。
答案 3 :(得分:0)
因为它是一个CSV而不是像JSON那样的东西,所以一切都将被读作一个字符串,所以只需将你的数字转换成一个字符串:
(string)$variable
strval($variable)
(我更喜欢这里)$variable . ''
PHP的gettype()
也是一种选择。您可以使用我描述的方法之一将每个字段输入到字符串中(即使它已经是一个字符串),或者您可以通过执行此操作来调出您之后的数字字段: < / p>
if (gettype($field) == 'integer' || gettype($field) == 'double') {
$field = strval($field); // Change $field to string if it's a numeric type
}
以下是添加
的完整代码function arrayToCsv( array $fields, $delimiter = ';', $enclosure = '"', $encloseAll = false, $nullToMysqlNull = false ) {
$delimiter_esc = preg_quote($delimiter, '/');
$enclosure_esc = preg_quote($enclosure, '/');
$outputString = "";
foreach($fields as $tempFields) {
$output = array();
foreach ( $tempFields as $field ) {
// ADDITIONS BEGIN HERE
if (gettype($field) == 'integer' || gettype($field) == 'double') {
$field = strval($field); // Change $field to string if it's a numeric type
}
// ADDITIONS END HERE
if ($field === null && $nullToMysqlNull) {
$output[] = 'NULL';
continue;
}
// Enclose fields containing $delimiter, $enclosure or whitespace
if ( $encloseAll || preg_match( "/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field ) ) {
$field = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure;
}
$output[] = $field." ";
}
$outputString .= implode( $delimiter, $output )."\r\n";
}
return $outputString;
}
答案 4 :(得分:0)
我使用此功能将php数组转换为csv。它也适用于多维数组。
public function array_2_csv($array) {
$csv = array();
foreach ($array as $item=>$val) {
if (is_array($val)) {
$csv[] = $this->array_2_csv($val);
$csv[] = "\n";
} else {
$csv[] = $val;
}
}
return implode(';', $csv);
}
答案 5 :(得分:0)
上面的函数并不完全正确,因为它认为\ n像一个元素,这不是我们想要的,因为每一行必须只用\ n分隔。所以更有效的代码是:
function array2csv($array, $delimiter = "\n") {
$csv = array();
foreach ($array as $item=>$val)
{
if (is_array($val))
{
$csv[] = $this->array2csv($val, ";");
}
else
{
$csv[] = $val;
}
}
return implode($delimiter, $csv);
}
答案 6 :(得分:0)
这是一个通用性更高的解决方案。我实际上是在寻找一种为SQL批量插入创建字符串列表的方法。代码如下:
foreach ($rows as $row) {
$string = toDelimitedString($row);
// Now append it to a file, add line break, whatever the need may be
}
这是我最终添加到我的taket中的有用功能:
/**
* Convert an array of strings to a delimited string. This function supports CSV as well as SQL output since
* the quote character is customisable and the escaping behaviour is the same for CSV and SQL.
*
* Tests:
* echo toDelimitedString([], ',', '\'', true) . "\n";
* echo toDelimitedString(['A'], ',', '\'', true) . "\n";
* echo toDelimitedString(['A', 'B'], ',', '\'', true) . "\n";
* echo toDelimitedString(['A', 'B\'C'], ',', '\'', true) . "\n";
* echo toDelimitedString([], ',', '\'', true) . "\n";
* echo toDelimitedString(['A'], ',', '"', true) . "\n";
* echo toDelimitedString(['A', 'B'], ',', '"', true) . "\n";
* echo toDelimitedString(['A', 'B"C'], ',', '"', true) . "\n";
*
* Outputs:
* <Empty String>
* 'A'
* 'A','B'
* 'A','B''C'
* <Empty String>
* "A"
* "A","B"
* "A","B""C"
*
* @param array $array A one-dimensional array of string literals
* @param string $delimiter The character to separate string parts
* @param string $quoteChar The optional quote character to surround strings with
* @param bool $escape Flag to indicate whether instances of the quote character should be escaped
* @return string
*/
function toDelimitedString(array $array, string $delimiter = ',', string $quoteChar = '"', bool $escape = true)
{
// Escape the quote character, since it is somewhat expensive it can be suppressed
if ($escape && !empty($quoteChar)) {
$array = str_replace($quoteChar, $quoteChar . $quoteChar, $array);
}
// Put quotes and commas between all the values
$values = implode($array, $quoteChar . $delimiter . $quoteChar);
// Put first and last quote around the list, but only if it is not empty
if (strlen($values) > 0) {
$values = $quoteChar . $values . $quoteChar;
}
return $values;
}
答案 7 :(得分:0)
灵感来自@alexcristea的答案:
function array2csv($data, $delimiter = ',', $enclosure = '"', $escape_char = "\\")
{
$f = fopen('php://memory', 'r+');
foreach ($data as $item) {
fputcsv($f, $item, $delimiter, $enclosure, $escape_char);
}
rewind($f);
return stream_get_contents($f);
}
$list = array (
array('aaa', 'bbb', 'ccc', 'dddd'),
array('123', '456', '789'),
array('"aaa"', '"bbb"')
);
var_dump(array2csv($list));
答案 8 :(得分:0)
此实现不使用文件指针,不应无意中修改传递给它的任何数据,仅在需要时进行转义,类似于 fputcsv()
(但没有 $escape_char
废话):
function str_putcsv(array $fields, string $delimiter = ',', string $enclosure = '"') {
$escs = [];
foreach ($fields as $field) {
$esc = (string) $field;
if (
false !== strpos($esc, $delimiter)
|| false !== strpos($esc, $enclosure)
) {
$esc = $enclosure . strtr($esc, ["$enclosure" => "$enclosure$enclosure"]) . $enclosure;
}
$escs[] = $esc;
}
return implode($delimiter, $escs) . PHP_EOL;
}
如果您的 PHP 版本不支持 string
类型声明,请删除它们。