2013-05-03 15 views
8

Ich habe mehrere Methoden, um PHP-Array zu CSV-String sowohl von Stackoverflow und Google zu transformieren. Aber ich habe Probleme, wenn ich eine Handynummer wie 01727499452 speichern möchte, speichert es als ohne ersten 0 Wert. Ich verwende derzeit dieses Stück Code: Convert array into csvConvert PHP-Array in CSV-String

Kann mir bitte jemand helfen.

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 
    ) 

)

Mein Codeblock:

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

Danke,

Pritom.

+2

Das ist das Problem mit den Rädern anderer Leute. – Ben

+2

Speichern Sie es als Zeichenfolge. Ich würde das sowieso für Telefonnummern empfehlen, weil Sie auch das + speichern möchten;) – SBI

+0

Können Sie ein Beispiel dafür geben, wie Ihr Array aussieht? – bestprogrammerintheworld

Antwort

10

Ist das, was Sie brauchen?

Es läuft durch Ihr Array erstellen eine neue Zeile auf jeder Schleife die Array-Werte mit einem "," zu trennen.

+0

Ist das was ich will? Bitte lesen Sie meine Frage und wenn Sie nicht klar sind, fragen Sie mich bitte. – Pritom

+0

Es sollte sein, ich sehe nicht, warum Sie nicht würden :) Geben Sie es eine Chance, und sehen, ob es Ihren Erwartungen entspricht. –

+0

Kein gültiges Ergebnis – Pritom

1

Sind Sie sicher, dass die Zahlen tatsächlich ohne führende Null gespeichert werden? Haben Sie sich die tatsächliche CSV-Ausgabe in einem Texteditor angesehen?

Wenn Sie die CSV-Datei in einer Tabellenkalkulationsanwendung geöffnet haben, interpretiert das Tabellenkalkulationsprogramm Ihre Telefonnummern höchstwahrscheinlich als numerische Werte und löscht die Nullen, wenn sie angezeigt werden. Sie können dies normalerweise in der Tabelle korrigieren, indem Sie die Formatierungsoptionen für diese bestimmte Spalte ändern.

18

könnten Sie str_putcsv Funktion:

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

Mehr dazu auf GitHub, eine Funktion erstellt von @johanmeiring.

+1

Es ist eine Nebensache, aber ich denke, du meintest $ csvString. = Str_putcsv ($ fp, $ Felder) ;. Fehlt das $;) –

+4

sollte es nicht '' 'str_putcsv ($ fields);' '' anstelle von '' 'str_putcsv ($ fp, $ fields);' ' – bamboofighter

+0

Ich mochte diese Lösung. Ich machte eine kleine Änderung, als ich es "entlehnt": '... $ len = ftell ($ fp) +1; Zurückspulen ($ fp); $ data = fread ($ fp, $ len); ... ' und es scheint zu funktionieren. Ich wusste nicht, was 1048576 darstellt, also wollte ich es nicht direkt verwenden. – Ghost8472

0

Da es sich um eine CSV ist und nicht so etwas wie JSON, alles wird sowieso als String gelesen werden so nur mit Ihrer Nummer in eine Zeichenfolge konvertieren:

  • (string)$variable
  • strval($variable) (die ich würde es vorziehen, hier)
  • concatenate mit einem leeren String wie $variable . ''

PHP gettype() wäre auch eine Option sein. Sie können jedes Feld in eine Zeichenfolge-Typ (auch wenn es bereits ist) durch eine der Methoden I beschrieben oder Sie können nur das Nummernfeld rufen Sie nach von dies zu tun:

if (gettype($field) == 'integer' || gettype($field) == 'double') { 
    $field = strval($field); // Change $field to string if it's a numeric type 
} 

Hier ist der vollständige Code mit ihm hinzugefügt

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

ich verwende diese Funktion pHP-Array csv zu konvertieren. Es funktioniert auch für mehrdimensionale Arrays.

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