首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Array_unique SORT_REGULAR标志

Array_unique SORT_REGULAR标志
EN

Stack Overflow用户
提问于 2013-02-10 21:16:08
回答 2查看 11.8K关注 0票数 12
代码语言:javascript
复制
$array = array(1, '1a', '1');
var_export(array_unique($array, SORT_REGULAR));
  • 结果:数组(0 => 1,2 => '1')
  • 在PHP手册中: SORT_REGULAR --通常比较项(不要更改类型)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-10 21:49:21

之所以会发生这种情况,是因为array_uniquehttp://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')!

票数 14
EN

Stack Overflow用户

发布于 2013-02-10 21:59:35

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

PHP_SORT_REGULAR标志简单地告诉array_unique返回到标准比较运算符(==)。

您可以在array_unique的源代码中看到这一点,它使用php_set_compare_func

代码语言:javascript
复制
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进行类型比较。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14802680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档