【问题标题】:PHP case insensitive sort producing different results using the same data in different orderPHP 不区分大小写的排序使用不同顺序的相同数据产生不同的结果
【发布时间】:2020-09-23 17:33:53
【问题描述】:

这是从我正在做的一个更大的项目中提取的,数据集不一样,但我已经将问题缩小到尽可能小,只是声明一个数组,对其进行排序并转储它,然而问题仍然存在并且可以重现。

这段代码:

<?php

$array = array("Z", "z", "Y", "y", "B", "b", "A", "a");

sort($array, SORT_STRING | SORT_FLAG_CASE);

var_dump($array);

结果:

array(8) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "B"
  [3]=>
  string(1) "b"
  [4]=>
  string(1) "Y"
  [5]=>
  string(1) "y"
  [6]=>
  string(1) "Z"
  [7]=>
  string(1) "z"
}

但是这段代码:

<?php

$array = array("Z", "z", "Y", "y", "b", "B", "a", "A");

sort($array, SORT_STRING | SORT_FLAG_CASE);

foreach( $array as $ar )
{
    echo $ar . PHP_EOL;
}

结果:

array(8) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "A"
  [2]=>
  string(1) "b"
  [3]=>
  string(1) "B"
  [4]=>
  string(1) "Y"
  [5]=>
  string(1) "y"
  [6]=>
  string(1) "Z"
  [7]=>
  string(1) "z"
}

为什么?它是相同的数据,以不同的顺序,以相同的方式排序 - 它肯定应该产生相同的一致输出吗?

我花了几天时间试图弄清楚这一点,这非常令人沮丧。也许这很简单,也许不是。

【问题讨论】:

  • 当您忽略大小写时,它们会变成相同的值,并且如手册所述如果两个成员比较相等,则它们在排序数组中的相对顺序是未定义的。跨度>

标签: php arrays sorting


【解决方案1】:

由于 Nigel 的评论已经解释了结果不一致的原因,这里有一个解决方法来获得所需的一致性。

<?php
$array = array("Z", "z", "Y", "y", "B", "b", "A", "a");

sort($array, SORT_STRING);
sort($array, SORT_STRING | SORT_FLAG_CASE);

var_dump($array);

$array = array("Z", "z", "Y", "y", "b", "B", "a", "A");
sort($array, SORT_STRING);
sort($array, SORT_STRING | SORT_FLAG_CASE);

var_dump($array);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多