微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP max()和min()使用不同类型的奇怪行为

过去两个小时我一直在摸索这个行为:
echo 'max(1,"a","2"   ) : '; var_dump( max( 1,'a','2' ) );
echo 'max(1,"2","a"   ) : '; var_dump( max( 1,'2','a' ) );
echo 'max(   "a",1) : '; var_dump( max( 'a',1 ) );
echo 'max(   "2",1) : '; var_dump( max( '2',1 ) );
echo "\n";
echo 'min(1,"2"   ) : '; var_dump( min( 1,'2' ) );
echo 'min(1,"a"   ) : '; var_dump( min( 1,'a' ) );
echo 'min(   "a",1) : '; var_dump( min( 'a',1 ) );
echo 'min(   "2",1) : '; var_dump( min( '2',1 ) );

打印出来:

max(1,"2"   ) : string(1) "2"
max(1,"a"   ) : string(1) "a"
max(   "a",1) : int(1)
max(   "2",1) : int(1)

min(1,"2"   ) : string(1) "2"
min(1,"a"   ) : string(1) "a"
min(   "a",1) : int(1)
min(   "2",1) : int(1)

当我期待:

max(1,"a"   ) : string(1) "2"
max(   "a",1) : string(1) "2"
max(   "2",1) : string(1) "2"

min(1,"2"   ) : string(1) "a"
min(1,1) : string(1) "a"
min(   "2",1) : string(1) "a"

请注意,max()和min()函数的值始终相同,但顺序不同.

此外,根据文档,与整数相比,不以数字字符开头的字符串被评估为整数0,但是字母数字比较多个字符串值.资源:

> http://php.net/manual/en/function.max.php
> http://php.net/manual/en/function.min.php

如何解释这个输出

min()max()中的比较按顺序进行,因为这可以在源代码中看到:

min() source code

//...
min = &args[0];

for (i = 1; i < argc; i++) {
    is_smaller_function(&result,&args[i],min);
    if (Z_TYPE(result) == IS_TRUE) {
        min = &args[i];
    }
}
//...

max() source code

//...
max = &args[0];

for (i = 1; i < argc; i++) {
    is_smaller_or_equal_function(&result,max);
    if (Z_TYPE(result) == IS_FALSE) {
        max = &args[i];
    }
}
//...

因此,您可以看到该函数通过数组并检查下一个值是否小于/大于先前最小/最大保存值.

要了解如何获得这些结果,您还必须知道值的比较是在PHP type juggling.之后完成的

那么让我们看两个例子来看看这些函数是如何工作的:

例1

max ( 1,'2' )
      │    │     │
      1 > 'a'    │
        │        │
        1    <  '2'
             │
             └ Result: '2'

>比较1和’a’,数字上下文表示’a’转换为0,1表示大于0.
→int 1返回
>比较1和’2′,数字字符串表示’2’转换为2,2,大于1.
→返回字符串’2′

>结果:字符串’2′

例2

max ( 1,'a' )
      │    │     │
      1 < '2'    │
        │        │
       '2'   <  'a'
             │
             └ Result: 'a'

>比较1和’2′,大于1.
→返回字符串’2′
>比较’2’和’a’,两个字符串均表示字符串比较,’a’与ASCII values相比大于’2′.
→返回字符串’a’

>结果:字符串’a’

所有其他示例都适用相同的规则.

原文地址:https://www.jb51.cc/php/136756.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐