2013-07-24 133 views
0

數組我有原來的數組是這樣的:訂購的特定值

 
$arr=array(10,8,13,8,5,10,10,12); 

,並希望使最終排序變爲:

 
$arr=array(10,10,10,8,8,13,12,5); 

要通過我這種方式得到最後的結果

$arr=array(10,8,13,8,5,10,10,12); 

// Remove array that contain array(1) 
$arr_diff=array_diff(array_count_values($arr), array(1)); 

// Remove array that contain keys of $arr_diff 
$arr=array_diff($arr, array_keys($arr_diff)); 

// Sort 
rsort($arr); 
ksort($arr_diff); 

// unshift 
foreach ($arr_diff as $k=>$v) 
{ 
    while ($v > 0) 
    { 
     array_unshift($arr,$k); 
     $v--; 
    } 
} 
// print_r($arr); 

我的問題是有另一種更簡單的方法嗎?

謝謝。

+1

該訂單的邏輯是什麼?發生次數? – deceze

+1

看起來像dups - >沒有dups然後高 - > – elclanrs

回答

3
$occurrences = array_count_values($arr); 
usort($arr, function ($a, $b) use ($occurrences) { 
    // if the occurrence is equal (== 0), return value difference instead 
    return ($occurrences[$b] - $occurrences[$a]) ?: ($b - $a); 
}); 

請參閱Reference: all basic ways to sort arrays and data in PHP

+0

注意:您可能必須反轉'$ a'和'$ b',這取決於您是要升序還是降序。我總是會對結果會產生困惑...... – deceze

+0

我收到通知,注意:未定義的變量:/ opt/lampp /中的出現... –

+0

是的,有一個錯字。已經修復。你應該親眼看到它。 – deceze