2016-06-09 5 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'); 
} 

그리고 첫 번째 입력란 일뿐입니다. 다른 입력란은 ok입니다.

답변

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