php rtrim的一个坑,很“二”的问题

Posted 凌雨尘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php rtrim的一个坑,很“二”的问题相关的知识,希望对你有一定的参考价值。

 

一、背景:

做项目的时候遇到一种情况,商家的营业时间显示的问题,设计图上要求显示成:“星期一,星期二,星期三,星期四,星期五,星期六,星期天”

换句话说,就是营业星期勾哪个就显示哪个,类似下面这样:

 

这里勾选之后呢,数据表里面保存的字段格式是:“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的一个坑,很“二”的问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP之string之rtrim()函数使用

PHP: thinkPHP踩坑记录(实现API接口以及处理莫名其妙的500问题)

php关于trim,rtrim,ltrim,substr 的字符串切割导致 json,_encode无法 识别数据的问题

php 判断小数点后面零不显示 php rtrim

PHP rtrim() 函数

代码片段 PHP,预期文件结尾,我错在哪里?