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

あなたの問題は、並べ替え関数の不安定な性質ではなく、同じ値を持つ 2 つの要素があるが、一方が他方の前に並べ替えられることを期待しているということです。

クライアントが英語よりもドイツ語を好むことを示すde-CHよりも高い重み付けが必要な場合は、の両方の値を指定しないでくださいen-US1

于 2012-08-06T20:33:18.593 に答える