zoukankan      html  css  js  c++  java
  • 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.
    ";
    echo json_encode($json)."
    ";
    echo "End.
    ";
    ?>

     对应的 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;

     

     

     

  • 相关阅读:
    SHELL
    Docker
    RHCE内容记要
    mysql基本知识的总结
    Linux启动提示Kernel panic
    配置tomcat、nginx实现反向代理(需操作)
    linux下nginx的安装和配置
    linux下安装mysql5.7(centos6.0)
    linux打包解压包(.tar .gz .tar.gz .zip)
    多重继承下的类型转换
  • 原文地址:https://www.cnblogs.com/lyc94620/p/9962062.html
Copyright © 2011-2022 走看看