1

编辑:使用 PHP 的 uasort 进行排序时,这个问题似乎与Preserve key order (stable sort) 重复

有人一直在假设它是稳定排序的情况下对arsort()解析的数组进行排序。HTTP_ACCEPT_LANGUAGE但它不是:https://bugs.php.net/bug.php?id=53553。现在我有一个错误,我有点茫然如何在不求助于黑客的情况下修复错误。

我有来自移动客户端的这个标头:

HTTP_ACCEPT_LANGUAGE: de-CH, en-US

这被解析为:

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

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

4

3 回答 3

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

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

于 2012-08-06T20:44:40.463 回答
0

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

如果de-CH应该加权高于en-US,表明客户更喜欢德语而不是英语,那么不要给他们两个值1

于 2012-08-06T20:33:18.593 回答
0

足够疯狂的PHP :)

它已经在文档中提到

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

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

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

于 2018-11-15T18:25:22.470 回答