GlareVPN使用日本在地伺服器‧日本本地IP位址,述不能訪問日本國內網站的情形將通通消失。  《魔物獵人崛起》免費大型更新「Ver.3.0」發布!追加新魔物&新結局!   「黎明死線」×「午夜凶鈴」!貞子將現身DbD!?   迪士尼扭曲仙境 x 他媽哥池!附有寮章的「扭曲哥池」決定發售!開始接受預約!   打機區域煥然一新!Frienbr x funglr Games的香薰噴霧登場!   與齋藤陽介、橫尾太郎和吉田直樹一起深入了解《Final Fantasy XIV》的《Yorha: Dark Apocalypse》內容   重大更新?「集合啦!動物森友會 Direct 2021.10.15」確定播出!   目標是成為傳說的貓皇!「貓咪大尋寶」登場!   冬天就玩喪屍遊戲!Back 4 Blood的期間限定內容以及遊戲平衡調整等等的更新內容正在免費發布! 

PHP 將 CSV 使用第一欄當 Key 來轉成陣列

商業

PHP 想將 CSV 轉成陣列,只要使用 str_getcsv() 即可,不過 CSV 的格式通常不會讓人這麼好過,CSV 常見幾個問題先列在下面:

  1. Big5 編碼 (Excel 存檔成 CSV 和要打開預設都是需要 Big5)
  2. BOM (若有存 UTF-8 的話,大多數會有 BOM)
  3. 分隔符號 (常見 "t" 和 ","),有時候還會確保整個字串,會用 """ 包起來 (三個 double quote)
  4. 第一行是標題,想直接拿來當 Key 操作

在此篇上述就不解決(其它文章有寫解法,在此不詳述),只解決 3 和 4 的問題。

PHP 將 CSV 使用第一欄當 Key 來轉成陣列

最近把第一欄當 Key 來操作 CSV 檔,蠻常使用的,所以想把古早前寫的 Code 貼出來即可,沒想到在 str_getcsv() 翻到其他人寫的作法,也蠻有趣的,所以也改寫幾個版本出來,有興趣可以參考看看。

資料準備 (以下都已 UTF-8 為主)

  • data.csv # 一般常見 csv 多以 "," 分隔
    序號,標題,內容,日期
    1,title,content,2018-01-01
    2,title2,content2,2018-01-02
  • data.tsv # 下述 [tab] 請自行取代成 "t" 的 tab
    序號[tab]標題[tab]內容[tab]日期
    1[tab]title[tab]content[tab]2018-01-01
    2[tab]title2[tab]content2[tab]2018-01-02

我最早期寫的 csv_to_array(),用法就是丟入檔名 和 分隔符號,就會用檔案的第一個欄位當 Key,將陣列印出。


使用方式

  • print_r(csv_to_array('data.csv', ','));
  • print_r(csv_to_array('data.tsv', "t"));

輸出結果

Array
(
    [0] => Array
    (
        [序號] => 1
        [標題] => title
        [內容] => content
        [日期] => 2018-01-01
    )

    [1] => Array
    (
        [序號] => 2
        [標題] => title2
        [內容] => content2
        [日期] => 2018-01-02
    )
)

再來於 PHP 官網的 str_getcsv() 看到的一些寫法,在這邊也做點整理和修改

一個非常簡短的寫法,使用 array_map + array_walk 來達成,一樣使用第一行當 Key,不過這個只能處理 "," 分隔的 CSV。


想要讓這種寫法,也可以處理各種分隔字元的話,處理方式會稍微複雜一點,主要是要如何讓 array_map 操作的 str_getcsv 吃參數的寫法,大概會如下:

  • $csv = array_map('str_getcsv', file($filename), ["t", "t", "t"]); // 三行需要三個 Tab

所以改寫如下:(註:if 包的 code 可以都由 else 的區塊取代即可,只是若分隔符號是 ",",就不需要多做那麼多處理)



Tsung

隨機商業新聞

PureVPN