一、背景:
做項目的時候遇到一種情況,商家的營業時間顯示的問題,設計圖上要求顯示成:“星期一,星期二,星期三,星期四,星期五,星期六,星期天”
換句話說,就是營業星期勾哪個就顯示哪個,類似下面這樣:
這里勾選之后呢,數據表里面保存的字段格式是:“1,2,3,4,5,6,7”
以前做的人處理這個的算法:
$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 吧
PHP rtrim() 函數
定義和用法
rtrim() 函數移除字符串右側的空白字符或其他預定義字符。
相關函數:
語法
rtrim(string,charlist)
二、問題:
正常的商家的設置基本上用這個算法不會出現任何問題,然而,就是這么偶然的機會,有一個商家只在星期二營業,這里就是個大坑!!!
因為用的字符串拼接的逗號是中文逗號,而且剛好使用了 rtrim ,結果神奇的事情就這么發生了,“星期二,”這個字符串用 rtrim 過濾掉 “,”這個中文逗號的時候會亂碼
因為這個亂碼,導致 json 返回之后 key 對應的 value 無法正常解析,導致整個 json 格式錯誤!
下面試驗一下,果然出問題了:
<?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:
到這里基本上已經發現問題的原因了,下面 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;