php rtrim的一個坑,很「二」的問題

 

1、背景:

作項目的時候遇到一種狀況,商家的營業時間顯示的問題,設計圖上要求顯示成:「星期一,星期二,星期三,星期四,星期五,星期六,星期天」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 吧函數

PHP rtrim() 函數

定義和用法

rtrim() 函數移除字符串右側的空白字符或其餘預約義字符。spa

相關函數:

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

語法

rtrim(string,charlist)

 

2、問題:

正常的商家的設置基本上用這個算法不會出現任何問題,然而,就是這麼偶然的機會,有一個商家只在星期二營業,這裏就是個大坑!!!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 的結果變成空白的。。。[捂臉][捂臉][捂臉]

 

3、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;
相關文章
相關標籤/搜索