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() 函数移除字符串右侧的空白字符或其他预定义字符。
相关函数:
语法
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的一个坑,很“二”的问题的更多相关文章
- 小程序踩过的一个小坑---解析二维码decodeURIComponent() url解码
因为我们需要用户扫码进入小程序,每一个货柜都有一个对应的二维码,当然每个二维码里的信息也不一样.用户扫码进入小程序之后,二维码的信息会以参数q带进去,而我们只能在onLoad事件中拿到这个参数, 但是 ...
- inno setup读取注册表遇到的一个坑
一.背景 目前,公司针对PR开发的一个插件需要发布到64位系统上.该插件包括一个prm格式的文件和若干个DLL文件.其中,prm文件需要复制到PR公共插件目录下,DLL需要复制到Windows系统目录 ...
- 《C++之那些年踩过的坑(二)》
C++之那些年踩过的坑(二) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. 今天讲一个小点,虽然小,但如果没有 ...
- android MultiDex multidex原理原理下遇见的N个深坑(二)
android MultiDex 原理下遇见的N个深坑(二) 这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑. 不了解的可以先看上篇文章:android MultiDex multi ...
- oracle入坑日记<二>认识oracle(含sqlplus基础使用)
1.SID(数据库实例) 1.1. oracle安装的时候有一项叫[全局数据库名]的填写项,这个就是oracle的SID也是数据库的唯一标识符: 1.2.一个oracle数据库有且只有一个SID(一般 ...
- Webapi创建和使用 以及填坑(二)
Webapi创建和使用 以及填坑(二) 上篇文章由于时间问题没能讲到POST提交,今天做一个补充 POST: 当我们直接通过POST发送方式发送会发现错误信息 参考解决:https://www.cnb ...
- 【转】最近用Timer踩了一个坑,分享一下避免别人继续踩
[转]最近用Timer踩了一个坑,分享一下避免别人继续踩 最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实 ...
- 关于fastjson的一个坑:输出json时,bean对象属性首字母默认被小写
fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴. 主要特点: 快速FAST: 比其它任何基于Java的解析器和生成器更快,包括jackson 强大:支 ...
- 记录我开发工作中遇到HTTP跨域和OPTION请求的一个坑
我通过这篇文章把今天工作中遇到的HTTP跨域和OPTION请求的一个坑记录下来. 场景是我需要在部署在域名a的Web应用里用JavaScript去消费一个部署在域名b的服务器上的服务.域名b上的服务也 ...
随机推荐
- Blender 工具使用—–准星
Blender 工具使用-–准星 移动准星 直接按鼠标左键 将准星放置在坐标原点 快捷键Shift + C 将准星放置到指定位置 比如下面这个位置: 按Shift + S快捷键组合,弹出一个工具栏,选 ...
- C++标准库vector以及迭代器
今天看C++的书,出现了一个新的概念,容器vector以及容器迭代器. vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存. ...
- R: 判别分析
判别与聚类的比较: 聚类分析和判别分析有相似的作用,都是起到分类的作用. 判别分析是已知分类然后总结出判别规则,是一种有指导的学习: 聚类分析则是有了一批样本,不知道它们的分类,甚至连分成几类也不知道 ...
- Luogu 2737 [USACO4.1]麦香牛块Beef McNuggets
NOIP2017 D1T1 的结论,两个数$a, b$所不能表示出的最大的数为$a * b - a - b$. 听了好几遍证明我还是不会 注意到本题中给出的数都非常小,所以最大不能表示出的数$\leq ...
- C++笔记--抽象机制
类 一个类就是一个用户定义类型 一个结构体也是一种类.(成员函数),因为不同的结构体中可能会有相同的名字的成员函数,所以我们在定义成员函数的时候就必须给出有关结构体的名字 void Data::ini ...
- jQuery AJAX 函数
jQuery 拥有供 AJAX 开发的丰富函数(方法)库. 什么是 AJAX? AJAX = Asynchronous JavaScript and XML. AJAX 是一种创建快速动态网页的技术. ...
- DjVu、PDF中的隐藏文本
作者:马健邮箱:stronghorse_mj@hotmail.com发布:2012.06.11 目录一.背景二.DjVu中的隐藏文本三.PDF中的隐藏文本 一.背景 目前对于扫描电子文档,网上比较流行 ...
- sqlserver小批量导数据
USE [KM_Voice] GO /****** Object: StoredProcedure [dbo].[proc_insert] Script Date: 01/09/2015 18: ...
- .net core 基于NPOI 的excel导入导出类,支持自定义导出哪些字段,和判断导入是否有失败的记录
#region 从Excel导入 //用法 //var cellHeader = new Dictionary<string, string>(); //cellHeader.Add(&q ...
- c++类 用冒号初始化对象(成员初始化列表)
c++类 用冒号初始化对象(成员初始化列表) 成员初始化的顺序不同于它们在构造函数初始化列表中的顺序,而与它们在类定义中的顺序相同 #include<iostream> ; using n ...