如果字符串lenght大于30,我想将“值”推入“数组”。所以我已经完成了这个PHP脚本:
if(!mb_strlen($string, 'utf-8')<=30) array_push($array, "value");
但是,如果字符串小于31,它也会推送该值...为什么?
答案 0 :(得分:7)
这样做的原因是PHP处理运营商的顺序。
它首先处理!mb_strlen($string, 'utf-8')
,所以如果长度为非零,则返回true。
然后评估true <= 30
,这总是正确的......
所以基本上唯一的例子是你的陈述是假的,如果给出一个零长度的字符串......
请参阅其他答案,了解如何编写声明。
答案 1 :(得分:4)
为什么不在编写代码时编写代码呢?
mb_strlen($string, 'utf-8') > 30
您的病情失败的原因是!
的{{3}}比<=
高!mb_strlen($string, 'utf-8')
。因此30
在与(!mb_strlen($string, 'utf-8')) <= 30
进行比较之前进行评估,即:
0
由于除true
之外的任何数字在operator precedence时评估为!mb_strlen($string, 'utf-8')
,因此对于空字符串,表达式true
仅为<=
。并且由于!mb_strlen($string, 'utf-8')
要求第一个操作数为数字,(int)true === 1
的布尔结果为converted to boolean,其中(int)false === 0
和{{1}}两者都小于或等于到30岁。
答案 2 :(得分:1)
为什么不使用更简单的条件?
if (mb_strlen($string, 'utf-8') > 30) array_push($array, "value");
答案 3 :(得分:1)
你的操作错误<= 30
小于或等于30,那就少于31,你应该使用。
要纠正错误,你应该使用>
运算符来证明左参数应该大于正确的论证。
如果你仔细观察炭的设计,你会看到>
的左侧比右侧更大。 (反之亦然)
以下链接将描述差异:
您还会注意到if语句中有一个感叹号,导致php在实际触发长度检查之前将结果转换为bool。
因此,您将始终尝试并评估true <= 30
,您应该删除感叹号。
尝试重写你的代码:
if(mb_strlen($string, 'utf-8') > 30)
{
array_push($array, "value")
}
答案 4 :(得分:1)
您需要将测试括在括号中:
if(!(mb_strlen($string, 'utf-8')<=30)) array_push($array, "value");