2016-06-09 3 views
0

Может ли кто-нибудь объяснить мне разницу - и как распознать или изменить формат?PHP CSV-Upload UTF-8 (с и без спецификации)

У меня простая форма загрузки 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 - все работает нормально.

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