2016-06-09 30 views
0

有人可能會解釋我的區別 - 以及如何識別或更改格式?PHP CSV上傳UTF-8(帶和不帶BOM)

我有一個簡單的HTML上傳表單,上傳後我用fgetcsv()解析文件內容。解析後,我已經這樣

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()的數組顯示我(顯然)完全相同的轉儲,使用時有或沒有BOM的文件,但是當我做一個簡單的循環,在這個陣列,並檢查OrderId(CSV中的第一個字段)爲空 - 當CSV編碼沒有BOM時,這總是失敗。當我保存與BOM相同的文件 - 一切工作正常。

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

它只是第一個字段 - 其他字段都可以。

回答

0

自己找到了。不知道,如果它是優雅的 - 但它的工作原理...

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