2016-06-09 13 views
0

Kann mir vielleicht jemand den Unterschied erklären - und wie kann ich das Format erkennen oder ändern?PHP CSV-Upload UTF-8 (mit und ohne Stückliste)

Ich habe ein einfaches HTML-Upload-Formular und nach dem Hochladen analysiere ich den Dateiinhalt mit fgetcsv(). Nach dem Parsen habe ich ein Array wie dieses

array(2) { 
    [0]=> 
    array(9) { 
    ["OrderId"]=> 
    string(13) "FG-456887" 
    ["Product"]=> 
    string(7) "B9876" 
    } 
    [1]=> 
    array(9) { 
    ["OrderId"]=> 
    string(13) "FG-852562" 
    ["Product"]=> 
    string(7) "B9877" 
    } 
} 

var_dump() zeigt mir (scheinbar) genau das gleiche dump, bei der Verwendung von Dateien mit oder ohne BOM, aber wenn ich eine einfache Schleife über dieses Array machen und prüfen, ob Die OrderId (erstes Feld in der CSV) ist leer - dies schlägt immer fehl, wenn die CSV ohne BOM codiert ist. Wenn ich dieselbe Datei mit BOM speichere, funktioniert alles.

foreach ($data as $position) { 
    $orderid = $position["OrderId"]; 
    if (empty($orderid)) die('No orderid found'); 
} 

Und es ist nur das erste Feld - die anderen Felder sind in Ordnung.

Antwort

0

Ich habe es selbst gefunden. Ich weiß nicht, ob es elegant ist - aber es funktioniert ...

function remove_utf8_bom($text) { 
    $bom = pack('H*','EFBBBF'); 
    $text = preg_replace("/^$bom/", '', $text); 
    return $text; 
} 

function csv_to_array($filename='', $delimiter=';', $seperator = '"') { 
    if(!file_exists($filename) || !is_readable($filename)) 
      return FALSE; 

    $csvdata = file($filename); 
    $header = NULL; 
    $data = array(); 
    foreach ($csvdata as $line) { 
     $row = remove_utf8_bom($line); 
     $row = str_getcsv($row,$delimiter,$seperator); 
     if(!$header) 
      $header = $row; 
     else 
      $data[] = array_combine($header, $row); 
    } 
    return $data; 
}