Array_unique SORT_REGULAR标志

时间:2013-02-10 21:16:09

标签: php

$array = array(1, '1a', '1');
var_export(array_unique($array, SORT_REGULAR));
  • 结果:数组(0 => 1,2 =>'1')
  • 在PHP手册中:SORT_REGULAR - 正常比较项目(不要更改类型)。

这背后的逻辑是什么?为什么或如何排除'1a'?

2 个答案:

答案 0 :(得分:13)

这是因为array_unique通过 first sorting the values as strings 工作,然后iterating通过排序数组工作,并且每个值都不包括在结果中所有连续值比较等于

根据第二个参数选择“比较相等”的比较函数,SORT_REGULAR==的等式检查相同。

这种行为引起了很多陷阱。由于排序是快速排序,它是不稳定的。因此,对包含1'1'的数组进行排序并不能保证哪一个最终会成为结果中的第一个。这意味着array_unique在某些情况下可能会“偏好”1而在其他情况下可能会'1'

然而疯狂仍在继续:考虑如果排序产生[1, '1', '1a'],那么'1a'包含在结果中(它比较等于1)如果排序产生['1', 1, '1a'],那么包含在内(它不等于字符串'1')!

答案 1 :(得分:4)

如果你想获得更多技术,你可以看到来源。

PHP_SORT_REGULAR标志只是告诉array_unique回退到标准比较运算符(==)。

您可以在使用array_uniquephp_set_compare_func来源中看到此内容:

static void php_set_compare_func(int sort_type TSRMLS_DC) /* {{{ */
{
switch (sort_type & ~PHP_SORT_FLAG_CASE) {
...
    case PHP_SORT_REGULAR:
    default:
        ARRAYG(compare_func) = compare_function;
        break;
} 

compare_func只是standard comparison function

这可能是一个文档错误,而不是其他任何东西。文档中的注释有点误导:

  

...当且仅当(字符串)$ elem1 ===(字符串)$ elem2

时相等

如果两个值都转换为字符串,则===是不必要的,但会导致假设SORT_REGULAR进行类型比较。