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