2014-01-20 134 views
0

我一直在解決以下問題。PHP:如何先按值排序數組,然後按鍵

我有此數組:

[596] => 2 
[9] => 2 
[358] => 2 
[1579] => 1 
[156] => 1 
[576] => 1 
[535] => 1 

正如你所看到的,值以降序方式排序的,但關鍵是隨機的。儘管如此,我還想按鍵排序DESC。我一直在玩array_multisort,但我一直無法解決它的問題。我遇到的第一個問題是array_multisort重新編制數字鍵的事實。我更改爲非數字變體的鍵,即k596等......這使我能夠對鍵進行排序,但不像我想要的那樣。

[k9] => 2 
[k596] => 2 
[k358] => 2 
[k576] => 1 
[k535] => 1 
[k1579] => 1 
[k156] => 1 

,我想最終看到的結果是:

[k596] => 2 
[k358] => 2 
[k9] => 2 
[k1579] => 1 
[k576] => 1 
[k535] => 1 
[k156] => 1 

有沒有人能幫助我在這裏?必須有一個簡單的方法來做到這一點,對吧?

回答

1

好吧這個問題有點棘手,然後我想!給定一個數組$arry = array('a'=>'hilbert', 'b'=>'noether', 'c'=>'landau');

我會生成一個包含這樣的元組第二陣列:通過串

$brry = array(); 
foreach($arry as $key => $value){ 
    $brry[] = array($key,$value); 
} 

//Now $brry looks like: 
//$brry: 
// [0] => array('a','hilbert'); 
// [1] => array('b','noether'); 
// [2] => array('c','landau'); 

//now you can easily sort it! 
usort($brry, "cmp"); 

//And then transform it back to the array structure you have before 
foreach($brry as $value){ 
    $crry[$value[0]] = $value[1]; 
} 

//with this sorting function cmp: 
function cmp($first, $second){ 
    if(strcmp($first[1], $second[1]) != 0){ 
     return strcmp($first[1], $second[1]); 
    } 
    else{ 
     return strcmp($first[0], $second[0]); 
    } 
} 

功能cmp種類現在這麼strcmp("192","20") > 0雖然這可能不是整數真!

1
uksort($array, function ($a, $b) use ($array) { 
    if ($array[$a] != $array[$b]) { 
     return $array[$a] - $array[$b]; 
    } 
    return $a - $b; 
}); 

插入適當的比較操作,這裏僅以-爲例。如果您依賴於PHP < 5.3並且沒有匿名函數,則這有點棘手。

+0

奇怪的是,我嘗試了類似的方法,但使用'$ array'作爲全局,並以「Array has modified」爲警告結束;這似乎工作。 –

+0

而不是返回$ a - $ b; '返回$ a> $ b;'然後'$ array = array_reverse($ array,TRUE);' –

+0

@Nouphal這是錯誤的。您需要返回值< 0, 0 or > 0,而不是布爾值。 – deceze