2016-07-18 1 views
3

連想配列をソートしたいのと同じ目的を達成するための組み込み関数があります。 arsort()ですが、この関数の問題は、値が同じ場合に元のキーの順序を維持しないことです。例: 私が欲しい値が同じときに連想配列を降順で並べ替え順にソートする

$l = [ 
    'a' => 1, 
    'b' => 2, 
    'c' => 2, 
    'd' => 4, 
    'e' => 5, 
    'f' => 5 
]; 

結果は次のとおりです。

$l = [ 
    'e' => 5, 
    'f' => 5, 
    'd' => 4, 
    'b' => 2, 
    'c' => 2, 
    'a' => 1 
]; 

arsort()は降順で結果を与えるが、それは、ランダムな値が同じである要素を配置します。 この質問は、PHP array multiple sort - by value then by key?の複製ではありません。その質問ではアルファベット順に並べ替えるのと同じ数値を求めていますが、私の質問では同じ値であれば元の順序に従ってソートされた値を求めています。

+0

http://php.net/manual/ en/function.array-multisort.phpまたはhttp://php.net/manual/en/function.usort.php –

+0

これは再現できません。あなたの例としては、arsortで希望する結果(e、f、d、b、c、a)を得る –

+0

確かに再現可能なhttps://3v4l.org/kqZLd – rjdown

答えて

2

おそらくこれを行うより効率的な方法がありますが、これは同じ値のグループ内で元のキーの順序を維持するように機能するはずです。

$l = [ 'a' => 1, 'b' => 2, 'c' => 2, 'd' => 4, 'g' => 5, 'e' => 5, 'f' => 5 ]; 
  1. グループ値によって配列::私は例えば、この配列から始めましょうforeachループは、配列の順番を読み取るため

    foreach ($l as $k => $v) { 
        $groups[$v][] = $k; 
    } 
    

    、キーがそれぞれに挿入されますグループは正しい順序で表示され、これにより次の結果が得られます。

    [1 => ['a'], 2 => ['b', 'c'], 4 => ['d'], 5 => ['g', 'e', 'f'] ]; 
    
  2. ソートキーの降順にグループ:

    krsort($groups); 
    
  3. は、ネストされたループとグループ化配列からソートされた配列を再組み立て:

    foreach ($groups as $value => $group) { 
        foreach ($group as $key) { 
         $sorted[$key] = $value; 
        } 
    } 
    
+0

@ dont-panic詳細な説明をいただきありがとうございます。うまく動作しています。 – user3542450

1

array_multisortを使用できます。この関数はちょっと混乱して説明が難しいかもしれませんが、複数の配列を注文し、最初の配列は後続の配列の順番に基づいてソートされます。

試してみてください。

array_multisort($l, SORT_DESC, array_keys($l)); 

はここに例を参照してください:https://3v4l.org/oV8Od

をそれは下降値で配列をソートし、その配列のキーの一種で更新されます。

+0

アレイ $ 1 = [ '' => 1、 'B' => 2、 'C' => 2、 'D' => 4、 「gで期待どおりに動作していません'=> 5、 ' e '=> 5、 ' f '=> 5 ]; 私は答えをg、e、f、d、b、c、aとしたいが、それは私にf、g、d、b、c、aを与える。 – user3542450

+0

その場合、カスタムロジックがあります( 'g'は通常 'e'と 'g'の後にあるため)、カスタムソートを実装する必要があります。 – Scopey

+0

論理を書く際に手伝ってください。私の問題のステートメントは、値が同じであれば元の配列と同じ順序に従うという単純なものです。 – user3542450

関連する問題