$array = array(1, '1a', '1');
var_export(array_unique($array, SORT_REGULAR));这背后的逻辑是什么?为什么或如何排除'1a‘?
发布于 2013-02-10 21:49:21
之所以会发生这种情况,是因为array_unique由http://lxr.php.net/xref/PHP_5_4/ext/standard/array.c#2787工作,然后是排序数组上的迭代法,对于每个值(不包括结果中的每个值),所有与其相比较的连续值都是相等的。
根据第二个参数选择上述“比较相等”的比较函数,对于SORT_REGULAR的比较函数与==的相等检查相同。
这种行为引起了许多问题。因为它是快速的,所以它不稳定。因此,对包含1和'1'的数组进行排序并不能保证结果中哪个数组将是第一个。这意味着,在某些情况下,array_unique可能会任意地“偏爱”1,而在其他情况下,'1'可能会被任意地“偏爱”。
然而,疯狂仍在继续:如果排序生成[1, '1', '1a'],那么'1a'将不包含在结果中(它比较等于1),而如果排序生成['1', 1, '1a'],那么它将被包含(它不等于字符串'1')!
发布于 2013-02-10 21:59:35
如果你想得到更多的技术,你可以看到来源。
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只是标准比较函数。
这可能是一个文档错误,比任何其他问题都要严重。文档中的评论有点误导人:
...equal当且仅当(字符串) $elem1 === (string) $elem2
如果这两个值都被转换为字符串,那么===是不必要的,但它会导致假设SORT_REGULAR进行类型比较。
https://stackoverflow.com/questions/14802680
复制相似问题