用PHP把字串等距切開
2009年04月09日週四12:48
© 風痕影,採用「創用 CC 姓名標示-非商業性-禁止改作 2.5 台灣 授權條款」授權。
在這次的案子裡,阿生是把日期中的符號全都拿掉,以「2009040905270627」這樣的形式來儲存研習活動的開始/結束時間,如果有多個時段的話就直接接在後面--雖然這樣比較節省欄位,卻苦了將時間顯示出來的部分;而且,這個顯示出來的部分,阿生是寫在顯示用的API裡,所以在我負責的「編輯研習」裡,就得自己重新處理一次日期時間的部分了。
單一時段「2009040905270627」可以用多個substr()來將切成年月日時分,但每個時段之間該如何拆分呢?光用explode()也得有分隔符號才可以啊!於是,今天清晨我開始尋找,PHP裡有沒有讓字串可以相等間隔切開的函式(每個時段的字串長度是相同的)。
結果,我找到了chunk_split()。
這個函式有三個參數:第一個是你要切割的字串、第二個是每段的長度(不指定的話就是76)、第三個是每段之間的分隔符號(不指定就是換行「\r\n」)。
雖然和我要的功能不一樣,但這個函式可以等距地在字串中插入符號,所以我可以先用它來幫字串加上分隔符號,例如底線之類的,接著再用explode(),根據底線來把時段切成陣列,就解決啦!
比較需要注意的是,分隔符號在最後一段字串後面也會出現(例如:chunk_split('123456789', 3, '_');會產生「123_456_789_」)所以explode()產生的陣列裡會多出一個值為空字串的元素,在用foreach()前記得先用unset()把它去掉,或者直接用for loop並只執行到倒數第二個元素。
順帶一提,今天還發現三個好用的函式:
- range():用range(1, 10);可以產生一個陣列,裡頭有十個元素,其值分別就是1到10;也可以用在英文上,例如range(a, c);可以產生array('a', 'b', 'c');
- strtotime():超方便的!可以用strtotime('now')取得目前的時間戳記,也可以用其他挺口語的方法,例如PHP官網上的例子就有strtotime('+1 week');和strtotime('next Thursday');
- tidy_repair_string():這是阿生告訴我的,可以用Tidy來清理(X)HTML
也筆記一下寫PHP時發現的兩件事情:
- EOF區段裡頭如果要跑PHP,阿生說是可以直接寫變數的;但我發現,如果是二維陣列的話,會變成這個樣子:在EOF裡使用$a[0]['b'],印出的東西會是$a[0]的值,加上['b']這個字串,所以會變成Array['b']--不知道數字index會不會也這樣
看到阿生寫了「!empty($a) && empty($b)」,可是那邊的邏輯如果是我來寫的話,會寫成「!empty($a) && !empty($b)」--莫非&&比!還優先?14日發現是我誤解那段程式的用途了,他其實並不是要達成我寫的那個邏輯,兩者還是不同的喔!