2010-12-04 6 views
1

配列を値の逆順にソートしたい。私はarsort PHP関数を使用しましたが、結果は私にとっては良くありません。配列をPHPの値の逆順にソートしたい

例:

私は次の配列をソートしたい:

arsort機能はdoesnのため、それは良くない
myArray =array ("c" => 4, "b" => 3, "e" => 2, "f" => 2, "d" => 1); 

myArray = array("d" => 1, "f" => 2, "b" => 3, "c" => 4, "e" => 2); 

結果はarsort PHPの機能を使用した後配列の要素の初期順序を保持しません。元の配列からのように、電子注文の前にF

myArray =array ("c" => 4, "b" => 3, "f" => 2, "e" => 2, "d" => 1); 

は、私のような結果が欲しいです。同じ値を持つキーは逆にしません。おかげさまで

+0

非常に珍しい作業ですが、私はそれを行う理にかなった理由は想像できません。ただし、usort()を使用して、ソートアルゴリズムを実装することができます。 –

+0

@Sharpnel。 usortの主な問題は、最終製品のキーを失うことです。自分でソート機能を定義しながらキーを保持するには、uasortを使用する必要があります。公式文書 – denica

+0

@Colを確認してください。またか? :)あなたが 'uasort'を使って書いた解決策を見たいと思います。私たちに教えてください。 –

答えて

3

編集: これは組み込み関数では実行できず、独自のソートソリューションを実装する必要があります。詳細はquestion I openedを参照してください。


それは、これらのソリューションが動作することを偶然です:

$myArray = array("d" => 1, "f" => 2, "b" => 3, "c" => 4, "e" => 2); 
uasort($myArray, function($a, $b){ 
    if($a == $b) 
     return 1; 
    else 
     return $b - $a; 
}); 
print_r($myArray); 

または

$myArray = array("d" => 1, "f" => 2, "b" => 3, "c" => 4, "e" => 2); 
uasort($myArray, function($a, $b){ 
    return $a <= $b; 
}); 
print_r($myArray); 
+0

これは良い解決策です。ありがとう –

0

この

arsort($array, krsort($array)); 
+0

'arsort()'の第2引数は、(型変換に関係なく)ブール値ではなく、バイナリフラグでなければなりません。そして 'krsort()'をやっている点は何ですか? – BoltClock

+0

これは間違いなく、OPが望んでいることはしません。これは最初にキーをソートし、OPは値が等しいキーのソートを避けたいと考えます。 –

0

を試してみてください、私はあなたの最善の策は、になることを考えますuasort PHP関数を使用します。 あなたのケースでuasortを使用する利点は、あなた自身のソートアルゴリズムを定義するための変更があり、PHPの比較メソッドに結びついていないことになります。

最初の値が2番目の値よりも小さいか、それ以上であるかどうかを評価するには、コールバック関数を定義する必要があります。

この機能の機能を理解するには、PHPの公式オンラインドキュメントをチェックする必要がありますが、私はあなたの問題に私自身の解決策を残すため、非常に理解しやすいと思います。彼らは同じ値を持っている場合、キーの元の順序を維持しながら、あなたが逆の並べ替えを行い、このコールバック関数で

function cmp($a, $b) { 
    if ($a == $b) { 
     return 0; 
    } 
    return ($a < $b) ? 1 : -1; 
} 

ベスト

、 デミアン

0

簡単に、どこにでも適用可能な方法がある:

<?php $a = array_flip($a); ksort($a); $a = array_flip($a); ?> 
  1. Array_flipは、各キー< ==>の値を反転させます。
  2. "now-keys"で配列をソートします。
  3. Array_flipは、以前のコンステレーションとバイナリソート配列を取得するために再度行います。

- ps: - なぜ複雑なのですか? @others。

0

何の応答は次のアレイに対して正しいではないようです:

$myArray = array( 
    "d" => 1, "Mircea Anca" => 2, 
    "b" => 3, "Iuliana Moise" => 2, 
    "c" => 4, "Florina Popescu" => 2) 
+0

私の答えを見てください。このタイプの応答がうまくいかない理由を理解する。 –

2

これは私のために働きました。

asortとarsort関数は、降順のキー値によって等しい値の行をソートするように見えるため、arsortは、値が等しい場合、より低いキー値をより高い値に「切り替え」ます。

私の解決策は、依然として望ましくない行を反転させて低から高にソートすることでした。そして、同じ値を持つ行を正しい位置に戻す配列を逆にします。

ORIG:配列([0] => 1 [1] => 0.5 [2] => 2 [3] => 3 [4] => 0.5)

ソート:配列([4] => 0.5 [1] => 0.5 [0] => 1 [2] => 2 [3] => 3) - キー値が同じ値の行に対して反転されたことを確認してください。

逆: ] => 3 [2] => 2 [0] => 1 [1] => 0.5 [4] => 0.5) - 配列を逆ソートし、等しい値を持つ行のキー整合性を保った。

$array=array(1,.5,2,3,.5); 
asort($array); 
$array=array_reverse($array,TRUE);