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

标签 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 ) );

打印出:

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() 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, &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. 比较 1'a',数字上下文意味着 'a' 被转换为 01 大于 0
    → 返回 int 1

  2. 比较 1'2',数字字符串意味着 '2' 被转换为 22 大于 1
    → 返回字符串'2'

  • 结果:字符串'2'

例子2

max ( 1 , '2' , 'a' )
      │    │     │
      1 < '2'    │
        │        │
       '2'   <  'a'
             │
             └ Result: 'a'
  1. 比较 1'2',数字字符串意味着 '2' 被转换为 22 大于 1
    → 返回字符串'2'

  2. 比较'2''a',两个字符串表示字符串比较,'a'大于'2' 刚刚与 ASCII values 进行了比较.
    → 返回字符串'a'

  • 结果:字符串'a'

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

关于PHP max() 和 min() 不同类型的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898382/

相关文章:

php - 如何在 Cakephp 中使用 containable 从不同的关联表中获取数据?

php - Paypal 电子邮件验证

php - 从 *.sql 文件进行多重查询,无需访问 phpmyadmin

php - 有人使用index.html吗?

创建一个猜数字游戏 C

java - 如何比较java中的两个日期?

f# - F# + 可变字段记录中的相等推理

php - 权限被拒绝 :/var/www/abc/. htaccess pcfg_openfile : unable to check htaccess file, 确保它是可读的?

java - "=="的 Int 和 Char 比较

python - 比较 Pandas Dataframe 的匹配行和列的差异