作项目的时候遇到一种状况,商家的营业时间显示的问题,设计图上要求显示成:“星期一,星期二,星期三,星期四,星期五,星期六,星期天”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 吧函数
rtrim() 函数移除字符串右侧的空白字符或其余预约义字符。spa
rtrim(string,charlist)
正常的商家的设置基本上用这个算法不会出现任何问题,然而,就是这么偶然的机会,有一个商家只在星期二营业,这里就是个大坑!!!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 的结果变成空白的。。。[捂脸][捂脸][捂脸]
到这里基本上已经发现问题的缘由了,下面 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;