7

phpで値に基づいて配列を並べ替える必要があります。配列は、キーと値にいくつかの数値を使用します。たとえば、次のようになります。

$a = array(70 => 1 ,82 => 5  ,61 => 3 ,55 => 1 ,34 => 2 ,53 => 2 ,21 => 4 ,13 => 5);

私はそれをこのようにソートするのが好きです:

Array
(
    [82] => 5
    [13] => 5
    [21] => 4
    [61] => 3
    [34] => 2
    [53] => 2
    [70] => 1
    [55] => 1
)

私は使用しましたが、機能しましたが、この関数はデフォルトのソートされたキーとソート配列を次のarsortように変更するため、問題があります。

Array
(
    [13] => 5
    [82] => 5
    [21] => 4
    [61] => 3
    [53] => 2
    [34] => 2
    [55] => 1
    [70] => 1
)
4

7 に答える 7

12

要素が元の配列のキー、値、および位置である新しい配列を作成します。

$temp = array();
$i = 0;
foreach ($array as $key => $value) {
  $temp[] = array($i, $key, $value);
  $i++;
}

次に、元の位置を考慮したユーザー定義の順序を使用して並べ替えます。

uasort($temp, function($a, $b) {
 return $a[2] == $b[2] ? ($a[0] - $b[0]) : ($a[2] < $b[2] ? 1 : -1);
});

最後に、元の連想配列に変換し直します。

$array = array();
foreach ($temp as $val) {
  $array[$val[1]] = $val[2];
}
于 2012-10-01T18:06:07.413 に答える
5

これはsort、関数のファミリーが安定していないためです。並べ替えを安定させる必要がある場合は、自分で実装するか、並べ替えた結果を繰り返し処理して、を使用して要素の位置を「修正」する必要がありますarray_splice

于 2012-10-01T15:44:47.323 に答える
4

参考までに、組み込み PHP 関数の一連の安定した並べ替えバリアントを Github: https://github.com/vanderlee/PHP-stable-sort-functionsに置きました。これは、@Barmar のソリューションと他のいくつかのトリックに基づいています。

于 2015-05-23T10:27:19.027 に答える
2

それはちょっと大きな回避策ですが、うまくいきます:

$a = array(70 => 1 ,82 => 5  ,61 => 3 ,55 => 1 ,34 => 2 ,53 => 2 ,21 => 4 ,13 => 5);
$b = max($a);
$c = min($a);
$d = 0;
$sorted_list = array();
while($b >= $c){
    foreach($a as $key => $value){
        if($value == $b){
            $sorted_list[$key] = $value;
        }
    }
    $b--;
}

vardump 出力:

array(8) { [82]=> string(1) "5" [13]=> string(1) "5" [21]=> string(1) "4" [61]=> string(1) "3" [34]=> string(1) "2" [53]=> string(1) "2" [70]=> string(1) "1" [55]=> string(1) "1" } 
于 2012-10-01T16:04:21.743 に答える
0

カスタマイズした並べ替え基準を満たす独自の並べ替え関数を作成し、usort() を使用して、作成した関数を使用して配列全体を反復処理し、配列を並べ替えることができます。

于 2012-10-01T16:06:56.083 に答える