过去两个小时我一直在摸不着这种行为:
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 ) );
Run Code Online (Sandbox Code Playgroud)
打印出来:
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)
Run Code Online (Sandbox Code Playgroud)
当我期待:
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"
Run Code Online (Sandbox Code Playgroud)
请注意,赋予max()和min()函数的值始终相同,但顺序不同.
此外,根据文档,与整数0相比,不以数字字符开头的字符串被计算为整数,但是按字母数字比较多个字符串值.资源:
怎么能解释这个输出?
min()和中的比较max()是按顺序完成的,如源代码中所示:
//...\nmin = &args[0];\n\nfor (i = 1; i < argc; i++) {\n is_smaller_function(&result, &args[i], min);\n if (Z_TYPE(result) == IS_TRUE) {\n min = &args[i];\n }\n}\n//...\nRun Code Online (Sandbox Code Playgroud)\n\n//...\nmax = &args[0];\n\nfor (i = 1; i < argc; i++) {\n is_smaller_or_equal_function(&result, &args[i], max);\n if (Z_TYPE(result) == IS_FALSE) {\n max = &args[i];\n }\n}\n//...\nRun Code Online (Sandbox Code Playgroud)\n因此,您可以看到该函数遍历数组并检查下一个值是否小于/大于先前保存的最小/最大值。
\n要了解如何获得这些结果,您还必须知道值的比较是在PHP 类型处理之后完成的。
\n让我们看两个示例来了解这些函数是如何工作的:
\nmax ( 1 , \'a\' , \'2\' )\n \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82\n 1 > \'a\' \xe2\x94\x82\n \xe2\x94\x82 \xe2\x94\x82\n 1 < \'2\'\n \xe2\x94\x82\n \xe2\x94\x94 Result: \'2\'\nRun Code Online (Sandbox Code Playgroud)\n比较1和\'a\',数字上下文意味着\'a\'转换为0,1大于0。
\n \xe2\x86\x92返回int1
比较1和\'2\',数字字符串意味着\'2\'转换为2,2大于1。
\n \xe2\x86\x92返回字符串\'2\'
max ( 1 , \'2\' , \'a\' )\n \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82\n 1 < \'2\' \xe2\x94\x82\n \xe2\x94\x82 \xe2\x94\x82\n \'2\' < \'a\'\n \xe2\x94\x82\n \xe2\x94\x94 Result: \'a\'\nRun Code Online (Sandbox Code Playgroud)\n比较1和\'2\',数字字符串意味着\'2\'转换为2,2大于1。
\n \xe2\x86\x92返回字符串\'2\'
比较\'2\'和\'a\',两个字符串都表示字符串比较,\'a\'大于\'2\'仅与ASCII 值比较。
\n \xe2\x86\x92返回字符串\'a\'
相同的规则适用于所有其他示例。
\n| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |