2012-01-28 20 views
1

私はキーが営業担当者である配列を持っています。キーの値は配列で、2つの値があります。パーセンテージ値と合計値です。PHPは配列内から配列の値をソートする

一言で言えば、私は一番上の最高パーセント値をソートしようとしています。

$sales = array(
    "Johnny Smith" => array(75.25,45), 
    "Ash Han" => array(55.67, 99), 
    "Janice K." => array(90.00, 40) 
); 

私はいくつかの取り決めや配列のソート機能を試してみた、と彼らは、配列の値からソートする配列である例を持っていないので、どれも、さえ表示するのに十分ではありません。

最終的な結果は、最も高いパーセンテージから最も低いパーセンテージまでの売上高を表示したい場合です。上記の場合、「Janice K.」 90.00の割合を持ち、彼女は40の売上高を持っています。一言で言えば、彼女は40の販売をしており、その90%が清算されています。

配列の場合、$キーの$値に基づいてソートすることはできますか?

答えて

3

uasort()は、ユーザー定義関数を使用して配列をソートし、インデックスの割り当てを維持します。ここでは、無名関数を使用した実装例を示します。

uasort($sales, function($a, $b) { 
    return $b[0] - $a[0]; 
}); 
print_r($sales); 

上記

Array (
    [Janice K.] => Array (
      [0] => 90 
      [1] => 40 
    ) 
    [Johnny Smith] => Array (
      [0] => 75.25 
      [1] => 45 
    ) 
    [Ash Han] => Array (
      [0] => 55.67 
      [1] => 99 
    ) 
) 
+0

が得られる@coffeemonitorこれは私が最初に書いたものを文字通りです。しかし、私が見いだした問題は、abs($ b [0] - $ a [0])が1未満であると、物事が乱れることです。戻り値は、abs(1)より小さい値を "これらが等しい"ことを意味する0に切り捨てる整数にキャストされているように見えます。これが私の答えを-1,0,1を返すように変更した理由です。おそらく、単純な '($ b [0] - $ a [0])* 100'はもっと簡単でしょう。 –

1

uasortです。

$sales = array(
    "Johnny Smith" => array(75.25,45), 
    "Ash Han" => array(55.67, 99), 
    "Janice K." => array(55.00, 40) 
); 

//comparison function. 
function cmp($a,$b){ 
    //if the percentages (key 0) are equal... 
    if($b[0]==$a[0]){ 
     //check sales count (key 1) 
     if($b[1]==$a[1]){ 
      //if both are equal, return 0 
      return 0; 
     } 
     //return -1 or 1 based on which sales are higher 
     return $b[1]<$a[1]?-1:1; 
    } 
    //return -1 or 1 based on which percentage is higher 
    return $b[0]<$a[0]?-1:1; 
} 
//run sort on sales using custom compare function. 
uasort($sales, 'cmp'); 
//print the values. 
echo '<pre>'; 
print_r($sales); 

編集:追加コメント。 edit2:売り上げによる追加ソート(desc)はパーセントが等しい。

関連する問題