插件窝 干货文章 PHP数组去重对数字和字符串的比较有何差异

PHP数组去重对数字和字符串的比较有何差异

123 array 字符串 uniqueArray 31    来源:    2025-03-16

在PHP中,数组去重时对数字和字符串的比较存在一些差异,主要体现在PHP的类型转换和比较规则上。以下是具体的差异和注意事项:

1. 数字和字符串的自动类型转换

  • PHP在比较时会自动进行类型转换。例如,字符串 "123" 和整数 123 在比较时会被视为相等。
  • 这意味着,如果数组中同时存在 "123"123,使用 array_unique() 函数去重时,它们会被认为是重复的,只保留其中一个。

    示例:

    $array = [123, "123", "456", 456];
    $uniqueArray = array_unique($array);
    print_r($uniqueArray);
    

    输出:

    Array
    (
       [0] => 123
       [2] => 456
    )
    
  • 可以看到,"123"123 被视为重复,只保留了 123

2. 严格比较模式

  • 如果你希望区分数字和字符串(即不进行自动类型转换),可以使用 array_unique()SORT_STRING 模式。
  • 在这种模式下,PHP会将所有元素转换为字符串后再进行比较,因此 123"123" 会被视为不同的值。

    示例:

    $array = [123, "123", "456", 456];
    $uniqueArray = array_unique($array, SORT_STRING);
    print_r($uniqueArray);
    

    输出:

    Array
    (
       [0] => 123
       [1] => 123
       [2] => 456
       [3] => 456
    )
    
  • 可以看到,123"123" 被视为不同的值,因此都被保留。

3. 自定义去重逻辑

  • 如果你需要更复杂的去重逻辑(例如区分数字和字符串),可以手动遍历数组并使用严格比较(===)来判断是否重复。

    示例:

    $array = [123, "123", "456", 456];
    $uniqueArray = [];
    foreach ($array as $value) {
       if (!in_array($value, $uniqueArray, true)) {
           $uniqueArray[] = $value;
       }
    }
    print_r($uniqueArray);
    

    输出:

    Array
    (
       [0] => 123
       [1] => 123
       [2] => 456
       [3] => 456
    )
    
  • 这里使用了 in_array() 的严格模式(第三个参数为 true),确保 123"123" 被视为不同的值。

总结

  • 默认情况下,PHP的 array_unique() 函数会对数字和字符串进行自动类型转换,因此 123"123" 会被视为重复。
  • 如果需要区分数字和字符串,可以使用 SORT_STRING 模式或手动实现去重逻辑。
  • 严格比较(===)可以确保数字和字符串不被视为相同。

根据你的需求选择合适的去重方式即可。