一、背景:

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

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

这里勾选之后呢,数据表里面保存的字段格式是:“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的一个坑,很“二”的问题的更多相关文章

  1. 小程序踩过的一个小坑---解析二维码decodeURIComponent() url解码

    因为我们需要用户扫码进入小程序,每一个货柜都有一个对应的二维码,当然每个二维码里的信息也不一样.用户扫码进入小程序之后,二维码的信息会以参数q带进去,而我们只能在onLoad事件中拿到这个参数, 但是 ...

  2. inno setup读取注册表遇到的一个坑

    一.背景 目前,公司针对PR开发的一个插件需要发布到64位系统上.该插件包括一个prm格式的文件和若干个DLL文件.其中,prm文件需要复制到PR公共插件目录下,DLL需要复制到Windows系统目录 ...

  3. 《C++之那些年踩过的坑(二)》

    C++之那些年踩过的坑(二) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. 今天讲一个小点,虽然小,但如果没有 ...

  4. android MultiDex multidex原理原理下遇见的N个深坑(二)

    android MultiDex 原理下遇见的N个深坑(二) 这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑. 不了解的可以先看上篇文章:android MultiDex multi ...

  5. oracle入坑日记<二>认识oracle(含sqlplus基础使用)

    1.SID(数据库实例) 1.1. oracle安装的时候有一项叫[全局数据库名]的填写项,这个就是oracle的SID也是数据库的唯一标识符: 1.2.一个oracle数据库有且只有一个SID(一般 ...

  6. Webapi创建和使用 以及填坑(二)

    Webapi创建和使用 以及填坑(二) 上篇文章由于时间问题没能讲到POST提交,今天做一个补充 POST: 当我们直接通过POST发送方式发送会发现错误信息 参考解决:https://www.cnb ...

  7. 【转】最近用Timer踩了一个坑,分享一下避免别人继续踩

    [转]最近用Timer踩了一个坑,分享一下避免别人继续踩 最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实 ...

  8. 关于fastjson的一个坑:输出json时,bean对象属性首字母默认被小写

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴. 主要特点: 快速FAST: 比其它任何基于Java的解析器和生成器更快,包括jackson 强大:支 ...

  9. 记录我开发工作中遇到HTTP跨域和OPTION请求的一个坑

    我通过这篇文章把今天工作中遇到的HTTP跨域和OPTION请求的一个坑记录下来. 场景是我需要在部署在域名a的Web应用里用JavaScript去消费一个部署在域名b的服务器上的服务.域名b上的服务也 ...

随机推荐

  1. JS中的引用类型

    JS的数据类型可以分为两类:一类是原始类型(比如数字.布尔值.字符串.undefined.null),另外就是对象类型.我们通常将对象类型称为引用类型.对象值都是引用.举个例子来说明,下如下的代码: ...

  2. java全栈day05--ArrayList的基本功能

    在前面我们学习了数组,数组可以保存多个元素,但在某些情况下无法确定到底要保存多少个元素,此时数组将不再适用,因为数组的长度不可变.例如,要保存一个学校的学生,由于不停有新生来报道,同时也有学生毕业离开 ...

  3. emr问题处理

    --通过his病历号查询emr中对应的患者ID --通过患者ID找出患者所有的病历集合ID --通过病历集合查找患者所有的病历 --通过病历dataID查找对应的病历数据,病历存在大字段中 '; -- ...

  4. tftp命令详解

    TFTP协议简介TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现.嵌入式linux的tftp开发环境包括两个方面: 一是linux服务器端的tftp-server支持,二是嵌入式目标 ...

  5. 回溯法和DFS leetcode Combination Sum

    代码: 个人浅薄的认为DFS就是回溯法中的一种,一般想到用DFS我们脑中一般都有一颗解法树,然后去按照深度优先搜索去寻找解.而分支界限法则不算是回溯,无论其是采用队列形式的还是优先队列形式的分支界限法 ...

  6. c 数组作为返回值注意

    static char* Test() { char buf[] ="aa"; printf("%s\n",buf); return buf; } int ma ...

  7. 十天入门java教程 Day02

    1,常量,变量的理解 常量,程序运行过程中,不能改变的,叫常量. 变量,程序运行过程中,改变的,叫变量. 2,变量的理解 变量,用来存储数据的,数据类型,存放哪种数据的种类. 变量的概念:程序运行期间 ...

  8. QQ空间爬虫--获取好友信息

    QQ空间网页版:https://user.qzone.qq.com/ 登陆后,进入设置,有一个权限设置,设置“谁能看我的空间”为好友可见,然后构造爬虫. (1)获取Cookie 两种方式: 第一种:通 ...

  9. Java基础之对包,类,方法,变量理解(灵感)

    包,类,方法,变量 灵感乍现 感觉就如电脑上的各个大小文档一般,只不过名称不同,用法不同,功效不同,就好比你要调用网上的一个图片,这个图片可以是变量,可以是方法,可以是类.你要调用可以把他幻化成接口, ...

  10. Dynamic Rankings(整体二分)

    Dynamic Rankings(整体二分) 带修区间第k小.\(n,q\le 10^4\). 这次我们旧瓶装新酒,不用带修主席树.我们用整体二分!整体二分是啥东西呢? 二分答案可以解决一次询问的问题 ...