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

And*_*nha 8 php comparison

过去两个小时我一直在摸不着这种行为:

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相比,不以数字字符开头的字符串被计算为整数,但是按字母数字比较多个字符串值.资源:

怎么能解释这个输出?

u_m*_*der 3

min()和中的比较max()是按顺序完成的,如源代码中所示:

\n

min()源代码

\n
//...\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//...\n
Run Code Online (Sandbox Code Playgroud)\n

max()源代码

\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//...\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

要了解如何获得这些结果,您还必须知道值的比较是在PHP 类型处理之后完成的。

\n

让我们看两个示例来了解这些函数是如何工作的:

\n

实施例1

\n
max ( 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\'\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 比较1\'a\',数字上下文意味着\'a\'转换为01大于0
    \n \xe2\x86\x92返回int1

    \n
  2. \n
  3. 比较1\'2\',数字字符串意味着\'2\'转换为22大于1
    \n \xe2\x86\x92返回字符串\'2\'

    \n
  4. \n
\n\n
    \n
  • 结果:字符串“2”
  • \n
\n

实施例2

\n
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\'\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 比较1\'2\',数字字符串意味着\'2\'转换为22大于1
    \n \xe2\x86\x92返回字符串\'2\'

    \n
  2. \n
  3. 比较\'2\'\'a\',两个字符串都表示字符串比较,\'a\'大于\'2\'仅与ASCII 值比较。
    \n \xe2\x86\x92返回字符串\'a\'

    \n
  4. \n
\n\n
    \n
  • 结果:字符串\'a\'
  • \n
\n

相同的规则适用于所有其他示例。

\n