过去两个小时我一直在摸索这个行为:
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’
所有其他示例都适用相同的规则.