[英]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.