将php数组转换为csv字符串

Pri*_*tom 12 php csv phone-number multidimensional-array

我有几种方法可以从stackoverflow和google将php数组转换为csv字符串.但是我遇到麻烦,如果我想存储01727499452等手机号码,它会保存为没有前0值.我目前正在使用这段代码: 将数组转换为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
    )
Run Code Online (Sandbox Code Playgroud)

)

我的代码块:

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; }
Run Code Online (Sandbox Code Playgroud)

谢谢,

Pritom.

ale*_*tea 26

你可以使用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);
 }
Run Code Online (Sandbox Code Playgroud)

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

  • 不应该是```str_putcsv($ fields);```而不是```str_putcsv($ fp,$ fields);``` (7认同)
  • 我喜欢这个解决方案。当我“借用”它时,我做了一个小修改:`... $len = ftell($fp)+1; 快退($fp); $data = fread($fp,$len); ...` 似乎有效。我不知道1048576代表什么,所以我不想直接使用它。 (2认同)

小智 16

这是你需要的吗?

$out = "";
foreach($array as $arr) {
    $out .= implode(",", $arr) . "\r\n";

}
Run Code Online (Sandbox Code Playgroud)

它通过你的数组运行,在每个循环上创建一个新行,用","分隔数组值.

  • 我在很多情况下都使用了类似的东西,它可以很好地发出警告(或两个).如果$ arr中的某个值中包含','字符,则会中断.csv格式具有处理它的方法,该解决方案未解决该问题.此外,您使用`"\ r \n"编写Windows特定换行符,这可能会在某些情况下导致问题.使用常量`PHP_EOL`将产生更多可移植代码. (9认同)

tra*_*ank 7

受到@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));
Run Code Online (Sandbox Code Playgroud)