0

重複の可能性:
PHPのuasortで並べ替えるときに、キーの順序を保持(安定した並べ替え)

私は配列を持っています:

$temp = Array('a' => 0, 'b' => 0,'c' => 1,'d' => 1,'e' => 0,'f' => 0,'g' => 2,'h' => 0);

値を昇順で並べ替えたいと思います。

asort($temp);
print_r($temp);

与える:

Array
    (
        [e] => 0
        [a] => 0
        [h] => 0
        [b] => 0
        [f] => 0
        [d] => 1
        [c] => 1
        [g] => 2
    )

しかし、どういうわけか、同じ値を持つエントリの構造を保持したいと思います。例:

Array
    (
        [a] => 0
        [b] => 0
        [e] => 0
        [f] => 0
        [h] => 0
        [c] => 1
        [d] => 1
        [g] => 2
    )

これは「ソート」ではなく、配列関数filter / map / walkであると思いますが、これを効率的に機能させる方法はわかりません。

もう少し情報:最大500個の値を約3500回ソートする必要があるため、速度と効率が最も重要です。プロセスは一晩で実行されるため、これらの数は毎日増加します。

何か案は?ありがとう。

編集:キーと値の両方を保持する必要があるため、asortを使用します。同じ値のエントリが複数あるため、値でのみ注文できます。私のアルファベットの例のキーは、私のクエリを簡単に説明するためのものですが、実際には数値であり、時系列ではありません。

4

2 に答える 2

0

array_multisort()関数に基づく私のソリューション(確かに最良のソリューションではありません):

<?php
$temp = array('a' => 0, 'b' => 0,'c' => 1,'d' => 1,'e' => 0,'f' => 0,'g' => 2,'h' => 0);

$keys   = array_keys($temp);
$values = array_values($temp);

array_multisort($values, $keys);

$temp = array_combine($keys, $values);
于 2012-11-27T17:26:06.410 に答える
0

値を並べ替えてもキーは保持されず、キーを並べ替えても値は保持されません。クロージャーを備えたphp 5.3を使用している場合はポリフィルできますが、それは最もクリーンな方法ではありません:

uksort($temp,function($a,$b)use($temp){
    if($temp[$a] < $temp[$b]){
        return -1;
     }
     if($temp[$a] > $temp[$b]){ 
        return 1;
     }
     return strcmp($a,$b);
  });          
于 2012-11-27T17:15:04.697 に答える