作項目的時候遇到一種狀況,商家的營業時間顯示的問題,設計圖上要求顯示成:「星期一,星期二,星期三,星期四,星期五,星期六,星期天」php
換句話說,就是營業星期勾哪一個就顯示哪一個,相似下面這樣:面試
這裏勾選以後呢,數據表裏面保存的字段格式是:「1,2,3,4,5,6,7」算法
之前作的人處理這個的算法:json
$work_week = ''; $week_arr = $weeks ? explode(',', $weeks) : array(); $week_list = array(1=>'星期一',2=>'星期二',3=>'星期三',4=>'星期四',5=>'星期五',6=>'星期六',7=>'星期天'); foreach ($week_arr as $w){ if(isset($week_list[$w])){ $work_week .= $week_list[$w].','; //這裏這個逗號是中文逗號 } }
//到這裏的時候,$work_week 是 '星期一,星期二,星期三,星期四,星期五,星期六,星期天,'
$work_week = rtrim($work_week, ',');//這裏有個坑!!!
//rtrim 以後會變成 '星期一,星期二,星期三,星期四,星期五,星期六,星期天'
先說一下 rtrim 吧函數
rtrim() 函數移除字符串右側的空白字符或其餘預約義字符。spa
rtrim(string,charlist)
正常的商家的設置基本上用這個算法不會出現任何問題,然而,就是這麼偶然的機會,有一個商家只在星期二營業,這裏就是個大坑!!!debug
由於用的字符串拼接的逗號是中文逗號,並且恰好使用了 rtrim ,結果神奇的事情就這麼發生了,「星期二,」這個字符串用 rtrim 過濾掉 「,」這個中文逗號的時候會亂碼設計
由於這個亂碼,致使 json 返回以後 key 對應的 value 沒法正常解析,致使整個 json 格式錯誤!code
下面試驗一下,果真出問題了:blog
<?php $test = "星期二,"; $a = rtrim($test, ','); echo $a; ?>
輸出:
對的,你沒看錯,中文的 「二」 跟中文逗號 」,「 放到一塊兒,使用 rtrim 過濾掉這個中文逗號的時候會變成亂碼
對的,你沒看錯,中文的 「二」 跟中文逗號 」,「 放到一塊兒,使用 rtrim 過濾掉這個中文逗號的時候會變成亂碼
對的,你沒看錯,中文的 「二」 跟中文逗號 」,「 放到一塊兒,使用 rtrim 過濾掉這個中文逗號的時候會變成亂碼
重要的事情說三遍!
下面模擬一下接口那邊的狀況:
<?php $test = "星期二,"; $a = rtrim($test, ','); $json = array("work"=>$a); echo "Begin.\n"; echo json_encode($json)."\n"; echo "End.\n"; ?>
對應的 json_encode 的結果變成空白的。。。[捂臉][捂臉][捂臉]
到這裏基本上已經發現問題的緣由了,下面 debug ,直接寫一個新的算法解決上面那個問題,避免使用中文逗號跟 rtrim,鬼知道下一次亂碼是何時
$work_week = $weeks; $week_list = array(1=>'星期一',2=>'星期二',3=>'星期三',4=>'星期四',5=>'星期五',6=>'星期六',7=>'星期天'); foreach ($week_list as $key => $value){ $work_week = str_replace($key, $value, $work_week); } return $work_week;