2011-12-21 72 views
1

成品數組排序數組將是這個樣子:PHP,通過密鑰長度和值

array(

'foo bar bar foo' => 10, 
'foo' => 10, 
'foo bar bar bar foo' => 6, 
'foo bar' => 6, 
'bar' => 6, 
'b' => 5 

) 

所以值由值第一排序,然後由密鑰的長度。

在MySQL我應該這樣做:

SELECT product, qty FROM stock ORDER BY qty DESC, LENGTH(product) DESC 

但我想做到這一點在PHP。

+0

也,是否有一個特別的原因,你想在PHP中做到這一點? – Ascherer 2011-12-21 21:09:12

+0

@Ascherer:數據不在MySQL中,我想避免將所有數據都放在那裏的傳輸時間。我的SELECT語句只是一個例子。 – Drahcir 2011-12-21 21:12:05

+0

ahh,k。這很有道理 – Ascherer 2011-12-21 21:23:40

回答

3

看看這個問題的答案:PHP array multiple sort - by value then by key?,似乎array_multisort是要走的路。 (我不太確定array_multisort是如何工作的,我只是有點黑了,它似乎工作)。

試試這個:

$arr = array(
    'foo bar' => 6, 
    'foo' => 10, 
    'bar' => 6, 
    'b' => 5, 
    'foo bar bar bar foo' => 6, 
    'foo bar bar foo' => 10 
); 

array_multisort(array_values($arr), SORT_DESC, 
    array_map(create_function('$v', 'return strlen($v);'), array_keys($arr)), 
    SORT_DESC, $arr); 

演示:http://codepad.org/mAttNIV7

更新:新增array_map排序依據的字符串的長度使得它,它只是在做之前:

$str1 > $str2,而不是strlen($str1) > strlen($str2)

更新2:在PHP> = 5.3中,您可以用真正的匿名函數替換create_function

array_map(function($v){return strlen($v);}, array_keys($arr)) 

演示2:http://codepad.viper-7.com/6qrFwj

+0

嗯,是的,這種方式比我原來的陣列效果更好,我原本避免了這個原因,我沒有認爲它會按字符串排序的長度,但它看起來像是lol – Ascherer 2011-12-21 21:24:58

+0

@Ascherer:它最初是通過做'$ a> $ b',它不是按長度排序的,它恰好是按照這個順序排列的。我添加了一個'array_map'來使它排序。 – 2011-12-21 21:31:56

+0

@火箭:感謝您花時間解決這個問題,您已經完美地解決了我的問題。 – Drahcir 2011-12-21 21:35:18

3

看看php的usortuasort

你應該能夠定義一個能像

不知道對其進行排序的功能是否會與當前的陣列很容易的工作,但這個會

$array = array(
array('name' => 'foo bar bar foo', 'qty' => 10), 
array('name' => 'foo', 'qty' => 6), 
array('name' => 'foo bar bar foo', 'qty' => 6), 
array('name' => 'foo bar', 'qty' => 6) 
); 

uasort($array, 'arraySort'); 

function arraySort($a, $b) 
{ 
    if($a['qty'] > $b['qty']) 
     return 1; 
    elseif($a['qty'] < $b['qty']) 
     return -1; 
    else 
     if(strlen($a['name']) >= strlen($b['name'])) 
      return 1; 
     else 
      return -1; 
} 
-2

使用排序功能PHP。確保你使用TRUE作爲第二個參數來保存密鑰。

+0

['sort'](http://php.net/sort)沒有「保留鍵」參數。如果你想這樣做,你可以使用['asort'](http://php.net/asort)。 – 2011-12-21 21:03:21

0

一個限制而排序長度的基礎上的鍵爲:長度相等鍵不重新排序。假設我們需要按照訂單號descending的順序排序。

$arr = array(
    "foo 0" => "apple", 
    "foo 1" => "ball", 
    "foo 2 foo 0 foo 0" => "cat", 
    "foo 2 foo 0 foo 1 foo 0" => "dog", 
    "foo 2 foo 0 foo 1 foo 1" => "elephant", 
    "foo 2 foo 1 foo 0" => "fish", 
    "foo 2 foo 1 foo 1" => "giraffe" 
); 

debug($arr, "before sort"); 
$arrBad = $arr; 
sortKeysDescBAD($arrBad); 
debug($arrBad, "after BAD sort"); 
sortKeysDescGOOD($arr); 
debug($arr, "after GOOD sort 2"); 

function sortKeysDescBAD(&$arrNew) { 
    $arrKeysLength = array_map('strlen', array_keys($arrNew)); 
    array_multisort($arrKeysLength, SORT_DESC, $arrNew); 
    //return max($arrKeysLength); 
} 

function sortKeysDescGOOD(&$arrNew) { 
    uksort($arrNew, function($a, $b) { 
     $lenA = strlen($a); $lenB = strlen($b); 
     if($lenA == $lenB) { 
      // If equal length, sort again by descending 
      $arrOrig = array($a, $b); 
      $arrSort = $arrOrig; 
      rsort($arrSort); 
      if($arrOrig[0] !== $arrSort[0]) return 1; 
     } else { 
      // If not equal length, simple 
      return $lenB - $lenA; 
     } 
    }); 
} 

function debug($arr, $title = "") { 
    if($title !== "") echo "<br/><strong>{$title}</strong><br/>"; 
    echo "<pre>"; print_r($arr); echo "</pre><hr/>"; 
} 

輸出將是:

before sort 
Array 
(
    [foo 0] => apple 
    [foo 1] => ball 
    [foo 2 foo 0 foo 0] => cat 
    [foo 2 foo 0 foo 1 foo 0] => dog 
    [foo 2 foo 0 foo 1 foo 1] => elephant 
    [foo 2 foo 1 foo 0] => fish 
    [foo 2 foo 1 foo 1] => giraffe 
) 

after BAD sort 
Array 
(
    [foo 2 foo 0 foo 1 foo 0] => dog 
    [foo 2 foo 0 foo 1 foo 1] => elephant 
    [foo 2 foo 0 foo 0] => cat 
    [foo 2 foo 1 foo 0] => fish 
    [foo 2 foo 1 foo 1] => giraffe 
    [foo 0] => apple 
    [foo 1] => ball 
) 

after GOOD sort 
Array 
(
    [foo 2 foo 0 foo 1 foo 1] => elephant 
    [foo 2 foo 0 foo 1 foo 0] => dog 
    [foo 2 foo 1 foo 1] => giraffe 
    [foo 2 foo 1 foo 0] => fish 
    [foo 2 foo 0 foo 0] => cat 
    [foo 1] => ball 
    [foo 0] => apple 
) 

通知elephantdog例如(或其他人)在兩個分揀方法的順序。第二種方法看起來更好。有可能是更簡單的方法來解決這個問題,但希望這可以幫助別人......