1. 程式人生 > >php rtrim的一個坑,很“二”的問題

php rtrim的一個坑,很“二”的問題

sch func fun left 圖片 sse bubuko 的人 ref

一、背景:

做項目的時候遇到一種情況,商家的營業時間顯示的問題,設計圖上要求顯示成:“星期一,星期二,星期三,星期四,星期五,星期六,星期天”

換句話說,就是營業星期勾哪個就顯示哪個,類似下面這樣:

技術分享圖片

這裏勾選之後呢,數據表裏面保存的字段格式是:“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() 函數移除字符串右側的空白字符或其他預定義字符。

相關函數:

  • ltrim() - 移除字符串左側的空白字符或其他預定義字符
  • trim() - 移除字符串兩側的空白字符或其他預定義字符

語法

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;

php rtrim的一個坑,很“二”的問題