繁体   English   中英

PHP-mb_strlen问题

[英]PHP - problem with mb_strlen

如果字符串长度大于30,我想将“值”推入“数组”。因此,我完成了以下PHP脚本:

if(!mb_strlen($string, 'utf-8')<=30) array_push($array, "value");

但是,如果字符串小于31,它也会推送该值...为什么?

这样做的原因是PHP处理运算符的顺序。

它首先处理!mb_strlen($string, 'utf-8') ,因此,如果长度非零,则返回true。

然后,它计算true <= 30 ,这始终是true ...

因此,从本质上讲,您的语句将为false的唯一情况是是否给出了长度为零的字符串...

有关应如何编写该语句,请参见其他答案。

为什么不说出语言就编写代码?

mb_strlen($string, 'utf-8') > 30

您的条件失败的原因是! 运算符优先级高于<= 因此,在将!mb_strlen($string, 'utf-8')30进行比较之前先对其求值,即:

(!mb_strlen($string, 'utf-8')) <= 30

并且由于除0以外的任何数字在转换为boolean时都计算为true ,因此表达式!mb_strlen($string, 'utf-8')仅对于空字符串为true 并且由于<=要求第一个操作数为数字,所以!mb_strlen($string, 'utf-8')的布尔结果将转换为整数 ,其中(int)true === 1(int)false === 0并且两者始终小于或等于30。

如果有条件,为什么不使用更简单的方法?

if (mb_strlen($string, 'utf-8') > 30) array_push($array, "value");

您在操作符上输入的错误<= 30小于或等于30,这就是所有小于31的原因,您应该使用。

要更正您的错误,您应该使用>运算符来显示左参数应大于右参数。

如果仔细看一下char的设计,您会发现>的左侧是刨丝器,然后是右侧。 (反之亦然)

以下链接将描述差异:

您还将注意到,在if语句中有一个感叹号,它导致php在实际执行长度检查之前将结果转换为bool。

因此,您将始终尝试尝试true <= 30 ,应删除感叹号。

尝试像这样重写代码:

if(mb_strlen($string, 'utf-8') > 30)
{
     array_push($array, "value")
}

您需要将测试括在方括号中:

if(!(mb_strlen($string, 'utf-8')<=30)) array_push($array, "value");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM