arsort()不稳定

时间:2012-08-06 20:18:51

标签: php sorting

修改:此问题似乎与Preserve key order (stable sort) when sorting with PHP's uasort

重复

有人一直在使用arsort()对从HTTP_ACCEPT_LANGUAGE解析的数组进行排序,假设它是一个稳定的排序。但事实并非如此:https://bugs.php.net/bug.php?id=53553。现在我有一个bug,我有点不知道如何修复bug而不诉诸黑客。

我从移动客户端获得此标头:

HTTP_ACCEPT_LANGUAGE: de-CH, en-US

并将其解析为:

Array (
    [de-CH] => 1
    [en-US] => 1
)

解析后arsort($array, SORT_NUMERIC)用于对与其q值对应的语言进行排序。但由于德语和英语具有相同的q值,arsort()交换德语和英语。如何对数组进行排序以便保留插入顺序?

3 个答案:

答案 0 :(得分:1)

如果您只是寻找首选语言,则无需对数组进行排序:

<?php

function findPrefferedLanguage($languages) {
  foreach ($languages as $lang => $weight) {
    if (empty($key) || ($weight > $languages[$key])) {
      $key = $lang;
    }
  }

  return $key;
}

$foo = array('es' => .6, 'en' => 1, 'fr' => 1, 'de' => .5);    

var_dump(findPrefferedLanguage($foo)); // en

匆忙测试......可能会有一些边缘情况会产生错误/警告。

答案 1 :(得分:0)

你的问题不是排序函数的不稳定性,而是你有两个具有相同值的元素,但你期望一个元素在另一个元素之前排序。

如果de-CH的加权值高于en-US,表明客户偏好德语而不是英语,则不会同时给出1 的值

答案 2 :(得分:0)

足够疯狂的PHP :)

文档中已经提到了

http://php.net/manual/en/function.arsort.php

  

如果两个成员比较相等,则它们在排序数组中的相对顺序是不确定的。

有趣的是,它在PHP 7中的工作方式有所不同