$array = array(1, '1a', '1');
var_export(array_unique($array, SORT_REGULAR));
这背后的逻辑是什么?为什么或如何排除'1a'?
答案 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_unique
的php_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
进行类型比较。