2013-05-03 16 views
8

Mam kilka metod przekształcania tablicy php na ciągi csv zarówno ze stackoverflow, jak i google. Ale mam kłopoty, że jeśli chcę przechowywać numer telefonu komórkowego, taki jak 01727499452, to zapisuje się jako bez pierwszej wartości 0. Obecnie używam tego fragmentu kodu: Convert array into csvKonwertuj tablicę php na ciągi csv

Czy ktoś może mi pomóc.

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 
    ) 

)

Mój blok kodu:

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

Dzięki

Pritom.

+2

To jest problem z używaniem kół innych osób. – Ben

+2

Zapisz jako ciąg. W każdym razie polecam to dla numerów telefonów, ponieważ po prostu będziesz chciał to również zapisać;) – SBI

+0

Czy możesz podać przykład jak twoja tablica wygląda? – bestprogrammerintheworld

Odpowiedz

10

Czy tego właśnie potrzebujesz?

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

} 

Prowadzi koryta swoją tablicę tworząc nową linię na każdej pętli rozdzielając wartości tablicy z „”.

+0

Czy tego właśnie chcę? Proszę przeczytać moje pytanie, a jeśli nie jesteś jasny, zapytaj mnie. – Pritom

+0

Powinno być, nie rozumiem, dlaczego nie zrobiłbyś tego :) Daj mu szansę i zobacz, czy spełnia twoje oczekiwania. –

+0

Niepoprawny wynik – Pritom

1

Czy jesteś pewien, że liczby są rzeczywiście zapisywane bez początkowego zera? Czy spojrzałeś na rzeczywiste wyniki CSV w edytorze tekstu?

Jeśli właśnie otworzyłeś plik CSV w aplikacji do arkuszy kalkulacyjnych, najprawdopodobniej arkusz kalkulacyjny interpretuje twoje numery telefoniczne jako wartości numeryczne i zrzuca zer podczas ich wyświetlania. Zazwyczaj można to naprawić w arkuszu kalkulacyjnym, zmieniając opcje formatowania w danej kolumnie.

18

Można użyć str_putcsv funkcję:

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

więcej na ten temat na GitHub, funkcję utworzoną przez @johanmeiring.

+1

To drobnostka, ale myślę, że chodziło o $ csvString. = Str_putcsv ($ fp, $ fields). Brakujące $;) –

+4

nie powinno to być '' 'str_putcsv ($ fields);' '' zamiast '' 'str_putcsv ($ fp, $ fields);' '' – bamboofighter

+0

Podobało mi się to rozwiązanie. Wprowadziłem jedną małą modyfikację, kiedy ją "pożyczyłem": '... $ len = ftell ($ fp) +1; do tyłu ($ fp); $ data = fread ($ fp, $ len); ... ' i wydaje się działać. Nie wiedziałem, co 1048576 reprezentuje, więc nie chciałem go używać bezpośrednio. – Ghost8472

0

Ponieważ jest to CSV, a nie coś takiego jak JSON, wszystko ma być odczytywane jako ciąg tak więc po prostu zamienić liczbę na łańcuch z:

  • (string)$variable
  • strval($variable) (który wolałbym tutaj)
  • concatenate z pustym ciągiem jak $variable . ''

PHP gettype() będzie również opcja. Można wpisać rzucić każde pole na sznurku (nawet jeśli już jest) za pomocą jednej z metod opisanych I czy można nazwać się tylko pole numer jesteś po przez to robi:

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

Oto pełny kod z dodała

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

używam tej funkcji do konwertowania tablicy pHP do csv. Działa również na tablicę wielowymiarową.

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