2012-01-17 11 views
1

別のparamによってそれらをソートし、私はそうのようにソートするオブジェクトの配列を持っている:配列を並べ替える、そのようにアルファベット順に

Array 
(
[463] => stdClass Object 
    (
     [name] => Organic 12 
     [total_weight] => 5 
    ) 
[340] => stdClass Object 
    (
     [name] => Organic 12b 
     [total_weight] => 5 
    ) 
[340] => stdClass Object 
    (
     [name] => Organic 12c 
     [total_weight] => 5 
    ) 
[532] => stdClass Object 
    (
     [name] => Alpha 10 
     [total_weight] => 4 
    ) 
[203] => stdClass Object 
    (
     [name] => General 5 
     [total_weight] => 3 
    ) 

のtotal_weightすべてのオブジェクトが最高から最低までソートされ、そのソート内でオブジェクトは名前のアルファベット順にソートされます。私は正常にtotal_weightによってPHPのusortでそれらを並べ替えることができますが、結果をサブソートする方法を把握することはできません。ソートされた結果に一貫性がないので、あるオブジェクトの名前が別のオブジェクトの名前の上に表示される可能性があります。

おそらくarray_multisortが答えかもしれないと思っていますが、私はそれを理解できないようです。

答えて

1

独自の比較関数を作成し、usortで適用します。このトリックは、ウェイトが等しいときに追加の比較を適用することです。

function compareObj($a, $b) 
{ 
    if ($a->total_weight == $b->total_weight) { 
     return strcmp($a->name, $b->name); 
    } 
    return ($a->total_weight > $b->total_weight) ? -1 : 1; 
} 

usort($array, "compareObj"); 
+0

OMG、同じ答え:

は、次のようになります! –

+0

美しい(そして素早く!) - ありがとう、百万 – jpea

1
function cmp($a, $b) 
{ 
    if ($a->total_weight == $b->total_weight) { 
     return strcmp($a->name, $b->name); 
    }else{ 
     return $a->total_weight > $b->total_weight ? -1 : 1 
    } 

} 

usort($array, "cmp"); 
関連する問題