PHP 5.3或更低版本中不区分大小写的数组键排序

19

PHP 5.4引入了有用的SORT_FLAG_CASE,可以使任何其他搜索不区分大小写。不幸的是,这在PHP 5.3或更低版本中不可用,因此我想知道以下数组该如何处理:

array('a'=>2,'b'=>4,'A'=>1,'B'=>3);

可以按照以下方式进行排序:

array('A'=>1,'a'=>2,'B'=>3,'b'=>4);

常规的ksort()函数将它排序为:

array('A'=>1,'B'=>3,'a'=>2,'b'=>4);

我必须在发布后两天才能接受它。 - M1ke
没错,我忘记了,所以请在一天后再提醒我 ;) - hakre
3个回答

40

在 PHP 函数参考页面的评论中,有人向我介绍了 uksort() 函数;这个函数(以及用于按值而不是键排序的 uasort() 函数)允许用户编写快速排序中的比较算法。

将这个函数与非常简单的 strcasecmp() 函数相结合(它比较两个字符串并返回<0表示 a>b,返回>0表示 a

uksort($array, 'strcasecmp');
为了轻松实现以下效果:
ksort($array,SORT_STRING | SORT_FLAG_CASE);
在PHP 5.3或更低版本中。

4
PHP的排序系统怎么会这么混乱?根据文档,sort($words, SORT_STRING | SORT_FLAG_CASE);应该能够对值进行不区分大小写的排序,但实际上并没有起作用。请问如何解决? - 7stud
该参数只适用于PHP 5.4版本。PHP因其年龄和使用而存在许多缺陷,但最近的更新主要集中于加强语言的一致性并提供其他语言已经使用的特性。 - M1ke
如何将uksort($array, 'strcasecmp');更改为按相反顺序排序? - Flion
你可以使用 array_reverse($arr) 来反转数组的顺序。如果你想保留数字键,则将 true 作为第二个参数传入(非数字键始终会被保留,因此在这个问题中可能并不必要)。 - M1ke
krsort($array, SORT_NATURAL | SORT_FLAG_CASE); 可以这样重写:uksort($array, function ($a, $b) { return strcasecmp($b, $a); });(支持 PHP 5.3)。 - Andron
虽然我很喜欢人们点赞这个问题,但我有些担心人们可能仍在使用5.3 - 如果你已经读到这部分,请考虑升级至至少7.2! - M1ke

2
这是我在PHP 7中如何对UTF8字符串数组进行(不区分大小写)排序的方法:
uksort($myarray, function ($a, $b) {
  $a = mb_strtolower($a);
  $b = mb_strtolower($b);
  return strcmp($a, $b);
});

对于 PHP 5.3 版本,您需要创建自己的排序函数:

function mySort1($a, $b) {
  $a = mb_strtolower($a);
  $b = mb_strtolower($b);
  return strcmp($a, $b);
}
uksort($result['rows'], 'mySort1');

0
我建议在数组键包含数字或为数字时使用SORT_NATURAL标记,以避免排序不自然的情况。
ksort($elements, SORT_NATURAL | SORT_FLAG_CASE);

标准排序:

Array
(
   img1.png => some_data_1
   img10.png => some_data_10
   img12.png => some_data_12
   img2.png => some_data_2
)

自然排序:

Array
(
    img1.png => some_data_1
    img2.png => some_data_2
    img10.png => some_data_10
    img12.png => some_data_12
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接