在过去的两个小时里,我一直在为这种行为挠头:
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", "2", 1) : '; var_dump( max( 'a', '2', 1 ) );
echo 'max( "2", "a", 1) : '; var_dump( max( '2', 'a', 1 ) );
echo "\n";
echo 'min(1, "a", "2" ) : '; var_dump( min( 1, 'a', '2' ) );
echo 'min(1, "2", "a" ) : '; var_dump( min( 1, '2', 'a' ) );
echo 'min( "a", "2", 1) : '; var_dump( min( 'a', '2', 1 ) );
echo 'min( "2", "a", 1) : '; var_dump( min( '2', 'a', 1 ) );
打印出:
max(1, "a", "2" ) : string(1) "2"
max(1, "2", "a" ) : string(1) "a"
max( "a", "2", 1) : int(1)
max( "2", "a", 1) : int(1)
min(1, "a", "2" ) : string(1) "2"
min(1, "2", "a" ) : string(1) "a"
min( "a", "2", 1) : int(1)
min( "2", "a", 1) : int(1)
当我期待的时候:
max(1, "a", "2" ) : string(1) "2"
max(1, "2", "a" ) : string(1) "2"
max( "a", "2", 1) : string(1) "2"
max( "2", "a", 1) : string(1) "2"
min(1, "a", "2" ) : string(1) "a"
min(1, "2", "a" ) : string(1) "a"
min( "a", "2", 1) : string(1) "a"
min( "2", "a", 1) : string(1) "a"
请注意,max()
和min()
函数的值始终相同,只是顺序不同。
此外,根据文档,与整数相比,不是以数字字符开头的字符串被评估为整数 0
,但多个字符串值按字母数字进行比较。来源:
如何解释这个输出?
最佳答案
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, &args[i], max);
if (Z_TYPE(result) == IS_FALSE) {
max = &args[i];
}
}
//...
因此您可以看到该函数遍历数组并检查下一个值是否小于/大于之前保存的最小/最大值。
要了解如何获得这些结果,您还必须知道值的比较是在 PHP type juggling. 之后完成的。
那么让我们看两个例子来了解函数是如何工作的:
示例 1
max ( 1 , 'a' , '2' )
│ │ │
1 > 'a' │
│ │
1 < '2'
│
└ Result: '2'
比较
1
和'a'
,数字上下文意味着'a'
被转换为0
,1
大于0
。
→ 返回 int1
比较
1
和'2'
,数字字符串意味着'2'
被转换为2
,2
大于1
。
→ 返回字符串'2'
- 结果:字符串'2'
例子2
max ( 1 , '2' , 'a' )
│ │ │
1 < '2' │
│ │
'2' < 'a'
│
└ Result: 'a'
比较
1
和'2'
,数字字符串意味着'2'
被转换为2
,2
大于1
。
→ 返回字符串'2'
比较
'2'
和'a'
,两个字符串表示字符串比较,'a'
大于'2'
刚刚与 ASCII values 进行了比较.
→ 返回字符串'a'
- 结果:字符串'a'
同样的规则适用于所有其他示例。
关于PHP max() 和 min() 不同类型的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898382/