2013-05-03 74 views
8

我有幾種方法將php數組轉換爲csv字符串,它們都來自於stackoverflow和google。但是,如果我想存儲手機號碼(如01727499452),則存在無法解析的問題。 我使用這段代碼: Convert array into csv將php數組轉換爲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 
    ) 

我的代碼塊:

​​

感謝,

Pritom。

+2

這就是使用其他人的輪子的問題。 – Ben 2013-05-03 06:03:56

+2

將其另存爲字符串。無論如何,我會建議您使用電話號碼,因爲您只需要保存該+號;) – SBI 2013-05-03 06:04:48

+0

您可以舉一個例子來說明陣列的外觀嗎? – bestprogrammerintheworld 2013-05-03 06:06:42

回答

10

這是你需要的嗎?

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

} 

它運行你的數組,在每個循環中創建一個新行,用「,」分隔數組值。

+0

這是我想要的嗎?請閱讀我的問題,如果你不清楚,請問我。 – Pritom 2013-05-03 06:29:10

+0

它應該是,我不明白爲什麼你不會:)給它一個鏡頭,看看它是否符合你的期望。 – 2013-05-03 06:29:55

+0

沒有有效的結果 – Pritom 2013-05-03 06:32:54

1

你確定這些數字實際上是沒有前導零保存嗎?你在文本編輯器中看過實際的CSV輸出嗎?

如果您剛剛在電子表格應用程序中打開了CSV文件,它很可能是電子表格將您的電話號碼解釋爲數字值,並在顯示時刪除零。您通常可以通過更改該特定列上的格式選項來修復該問題。

18

您可以使用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($fp, $fields); 
} 

更多關於這對GitHub,通過@johanmeiring創建的函數。

+1

這是一件小事,但我認爲你的意思是$ csvString。= str_putcsv($ fp,$ fields);.缺少$;) – 2014-07-11 16:14:36

+4

不應該是'''str_putcsv($ fields);'''而不是''str_putcsv($ fp,$ fields);''' – bamboofighter 2017-04-11 14:27:13

+0

我喜歡這個解決方案。當我「借」它時,我做了一個小修改: '... $ len = ftell($ fp)+1; rewind($ fp); $ data = fread($ fp,$ len); ...' 它似乎工作。我不知道1048576代表什麼,所以我不想直接使用它。 – Ghost8472 2017-11-28 00:00:12

0

因爲它是一個CSV,而不是像JSON,一切都將是無論如何解讀爲一個字符串,所以只要你的電話號碼轉換成字符串:

  • (string)$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; 
} 
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); 
}