修改:此问题似乎与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()
交换德语和英语。如何对数组进行排序以便保留插入顺序?
答案 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中的工作方式有所不同