将php数组转换为csv字符串

将php数组转换为csv字符串,php,csv,multidimensional-array,phone-number,Php,Csv,Multidimensional Array,Phone Number,我有几种方法将php数组从stackoverflow和google转换为csv字符串。但我遇到了麻烦,如果我想存储手机号码,如01727499452,它会保存为没有前0个值。 我目前正在使用这段代码: 谁能帮帮我吗 Array [1] => Array ( [0] => Lalu ' " ; \\ Kumar [1] => Mondal [2] => 01934298345 [3] =>

我有几种方法将php数组从stackoverflow和google转换为csv字符串。但我遇到了麻烦,如果我想存储手机号码,如01727499452,它会保存为没有前0个值。 我目前正在使用这段代码:

谁能帮帮我吗

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.

这就是你需要的

$out = "";
foreach($array as $arr) {
    $out .= implode(",", $arr) . PHP_EOL;

}

它在数组中运行,在每个循环上创建一条新行,用“,”分隔数组值

您确定实际保存的数字没有前导零吗?您是否查看了文本编辑器中的实际CSV输出


如果您刚刚在电子表格应用程序中打开CSV文件,则很可能是电子表格将您的电话号码解释为数值,并在显示时删除零。您通常可以通过更改该特定列上的格式选项在电子表格中解决此问题。

您可以使用
str\u putcv
函数:

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);
 }

关于这个的更多信息,这是一个由@johanmeiring创建的函数。

因为它是一个CSV,而不是JSON,所有内容都将被读取为字符串,所以只需使用以下命令将您的数字转换为字符串:

  • (字符串)$variable
  • strval($variable)
    (我更喜欢这里)
  • 使用空字符串连接,如
    $variable''
PHP的
gettype()
也是一个选项。您可以使用我描述的方法之一,将每个字段类型强制转换为字符串(即使它已经是一个字符串),也可以通过执行以下操作来调用所需的数字字段:

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; 
}

我使用这个函数将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);
}

上面的函数不完全正确,因为它认为\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);
}

这里有一个更通用的解决方案。实际上,我正在寻找一种为SQL批量插入创建字符串列表的方法。代码如下所示:

foreach ($rows as $row) {
    $string = toDelimitedString($row);
    // Now append it to a file, add line break, whatever the need may be
}
下面是我最后添加到tookit中的有用功能:

/**
 * 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;
}
/**
*将字符串数组转换为分隔字符串。此函数支持CSV和SQL输出,因为
*引号字符是可自定义的,转义行为与CSV和SQL相同。
*
*测试:
*回显toDelimitedString([],',','\'',true)。“\n”;
*回显toDelimitedString(['A'],',','\'',true)。“\n”;
*回显toDelimitedString(['A','B'],',','\'',true)。“\n”;
*回显到删除字符串(['A','B'C'],',','\'',true)。“\n”;
*回显toDelimitedString([],',','\'',true)。“\n”;
*回显toDelimitedString(['A'],',','''',true)。“\n”;
*回显toDelimitedString(['A','B'],',','''',true)。“\n”;
*回显toDelimitedString(['A','B'C'],',',','''',true)。“\n”;
*
*产出:
*  
*“A”
*“A”,“B”
*“A”,“B”,“C”
*  
*“A”
*“A”、“B”
*“A”、“B”、“C”
*
*@param array$array字符串文字的一维数组
*@param string$分隔符用于分隔字符串部分的字符
*@param string$quoteChar用于环绕字符串的可选引号字符
*@param bool$转义标志,用于指示是否应转义引号字符的实例
*@返回字符串
*/
函数toDelimitedString(数组$array,字符串$delimiter=',',字符串$quoteChar='“',bool$escape=true)
{
//转义引号字符,因为它有点昂贵,所以可以抑制它
if($escape&!empty($quoteChar)){
$array=str_替换($quoteChar,$quoteChar.$quoteChar,$array);
}
//在所有值之间加引号和逗号
$values=内爆($array,$quoteChar.$delimiter.$quoteChar);
//在列表周围放置第一个和最后一个引号,但前提是它不是空的
如果(strlen($value)>0){
$values=$quoteChar.$values.$quoteChar;
}
返回$value;
}

灵感来自@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));

此实现不使用文件指针,不应无意中修改传递给它的任何数据,并且仅根据需要进行转义,类似于
fputcsv()
(但不使用
$escape\u char
):

函数str_putcsv(数组$fields,字符串$delimiter=',',字符串$enclosure='”){
$escs=[];
foreach($fields作为$field){
$esc=(字符串)$字段;
如果(
false!==strpos($esc,$delimiter)
||false!==STRPO($esc,$enclosure)
) {
$esc=$enclosure.strtr($esc,[“$enclosure”=>“$enclosure$enclosure”])。$enclosure;
}
$escs[]=$esc;
}
返回内爆($delimiter,$escs);
}

如果您的PHP版本不支持类型声明,请删除
字符串
类型声明。

这就是使用其他用户控制盘的问题。请将其另存为字符串。不管怎样,我还是建议您将其用于电话号码,因为您只需要将其保存为+即可;)您应该使用PHP内置的CSV函数,比如一些二手建议:如果您不打算对其进行算术运算,请将其存储为字符串。包含许多以科学记数法打印的电话号码的示例,这些电话号码最终源于某人将其存储为整数。该号码将正确存储在CSV中,前导为零;但是,当在MS Excel中打开时,Excel将对其进行重新格式化-或者使用一种已经支持格式信息的文件格式(不是CSV),这样Excel就不会应用其标准行为,或者在保存
=“01911224589”
时将其强制为公式字符串。这是我想要的吗?请阅读我的问题,如果你不清楚,请问我。应该是,我不明白你为什么不:)试一试,看看它是否符合你的期望。我在许多情况下使用过类似的东西,效果很好