2013-05-03 11 views
8

Ho diversi metodi per trasformare l'array php in stringa csv sia da stackoverflow che da google. Ma sono nei guai che se voglio memorizzare un numero di cellulare come 01727499452, salva come senza il primo valore 0. Attualmente sto usando questo codice: Convert array into csvConverti php array in stringa csv

Qualcuno può aiutarmi per favore.

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 
    ) 

)

mio blocco di codice:

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

Grazie,

Pritom.

+2

Questo è il problema con l'utilizzo delle ruote di altre persone. – Ben

+2

Salvalo come una stringa. Lo consiglierei comunque per i numeri di telefono, perché vorresti solo salvare anche quello +;) – SBI

+0

Puoi dare un esempio di come è la tua matrice? – bestprogrammerintheworld

risposta

10

È questo quello che ti serve?

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

} 

Viene eseguito tramite l'array creando una nuova riga su ciascun ciclo separando i valori dell'array con un ",".

+0

È questo che voglio? Per favore, leggi la mia domanda e se non sei chiaro, per favore chiedimi. – Pritom

+0

Dovrebbe essere, non vedo perché non vuoi :) Fare un tentativo, e vedere se soddisfa le vostre aspettative. –

+0

Nessun risultato valido – Pritom

1

Sei sicuro che i numeri vengano effettivamente salvati senza lo zero iniziale? Hai guardato l'output CSV in un editor di testo?

Se è stato appena aperto il file CSV in un'applicazione foglio di calcolo, è molto probabile che il foglio di calcolo interpreti i numeri di telefono come valori numerici e rilasci gli zeri durante la visualizzazione. Di solito puoi correggerlo nel foglio di calcolo cambiando le opzioni di formattazione su quella particolare colonna.

18

È possibile utilizzare la funzione 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); 
} 

Ulteriori su questi su GitHub, una funzione creata da @johanmeiring.

+1

È una cosa secondaria, ma penso che intendessi $ csvString. = Str_putcsv ($ fp, $ fields) ;. Manca $;) –

+4

non dovrebbe essere '' 'str_putcsv ($ fields);' '' invece di '' 'str_putcsv ($ fp, $ fields);' '' – bamboofighter

+0

Mi è piaciuta questa soluzione. Ho apportato una piccola modifica quando l'ho "preso in prestito": '... $ len = ftell ($ fp) +1; rewind ($ fp); $ data = fread ($ fp, $ len); ... ' e sembra funzionare. Non sapevo cosa rappresentasse 1048576, quindi non volevo usarlo direttamente. – Ghost8472

0

Dal momento che è un file CSV e non qualcosa come JSON, tutto sta andando per essere letto come una stringa in ogni caso quindi basta convertire il numero in una stringa con:

  • (string)$variable
  • strval($variable) (che io preferirei qui)
  • concatenate con una stringa vuota come $variable . ''

PHP di gettype() sarebbe anche un'opzione. È possibile digitare lanciare ogni campo in una stringa (anche se già è uno) utilizzando uno dei metodi che ho descritto oppure è possibile chiamare fuori solo il campo del numero che stai dopo da questo modo:

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

Ecco il codice completo con esso aggiunto

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

sto usando questa funzione per convertire array PHP in formato CSV. Funziona anche per array multidimensionali.

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