PHP 依固定長度切割字串(unpack)

切割字串通常都是有某些特殊分隔用 split 來分隔, 而另外一種是固定長度的切割法, 就是第一欄長度是 20, 第二欄長度是 15 .. 等, 遇到這種可以使用 unpack 來切割.

簡單範例

下述範例 $str 裡面第一欄的長度是 10, 第二欄是 10, 第三欄是 9, 第四欄是 8 (算法是由字串開始算到最後面空白結束), 那 unpack 用法就如下述範例:


<?php
$str = '12/01/08  00:22:33  112233   12342222';
print_r(unpack('a10date/a10time/a9phone/a8tel', $str));
?>

輸出結果:


Array
(
    [date] => 12/01/08
    [time] => 00:22:33
    [phone] => 112233
    [tel] => 12342222
)

unpack 裡面的第一欄 format 格式, 上述用的都是 a NUL-padded string (詳細格式可見: pack), "/" 是分隔下一欄用, 所以格式寫起來是 "10個字 指定給 date 的變數 / 10個字 指定給 time 的變數 ... 等", 而因為是固定字串, 所以這些資料印出來的後面, 有可能會有空白, 可以再用 trim 去掉.

範例: 讀檔再切割

範例2: (讀檔再切割)


<?php
$handle = fopen("unpack.txt", "r");
while (!feof($handle)) {
    $t = unpack("a10date/a10time/a9phone/a8tel", fgets($handle));

    $date  = trim($t['date']);
    $time  = trim($t['time']);
    $phone = trim($t['phone']);
    $tel   = trim($t['tel']);

    // todo something.
}
fclose($handle);
?>


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming。將永久鏈結加入書籤。

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料