1. 程式人生 > >PHP排序函式array_multisort用法【…

PHP排序函式array_multisort用法【…

今天研究了一下php的array_multisort,理解了之後發現他很強大,而且也不復雜。(手冊上關於這個函式的講解看得很費力)

一、先看最簡單的情況。有兩個陣列:

$arr1 = array(1,9,5);
$arr2 = array(6,2,4);

array_multisort($arr1,$arr2);

print_r($arr1); // 得到的順序是1,5,9
print_r($arr2); // 得到的順序是6,4,2

我估計兩個陣列的值自始至終都是對應著的:1對應6,9對應2,5對應4。

我們再加多一個數組看看會怎樣:

$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
$arr3 = array(3,7,8);

array_multisort($arr1,$arr2,$arr3);

檢視結果,1自始至終都對應6對應3,其它項也是如此。這種對應關係就是手冊中所謂的“排序時保留原有的鍵名關聯”。

另外也可以把每個陣列想像成資料庫表的一列。而對應著的1,6,3為一資料行,9,2,7為另一資料行。。。

array_multisort會先按第一個陣列(想像成列)排序,如果第一個陣列(列)的值相同,則按第二個陣列(列)排序。

具體可以用下面的程式來測試:

$arr1 = array(1,9,5,9);
$arr2 = array(6,2,4,1);
$arr3 = array(3,7,8,0);

array_multisort($arr1,$arr2,$arr3);

可以想像這裡$arr3的結果是(3,8,0,7)。

二、接下來講解array_multisort的引數。這個函式的引數很靈活。最簡單的情況是如上面所示的以1個或n個數組作為引數,需要注意的是每個陣列的項數要一樣,否則會warning導致排序失效。

像這樣array_multisort($arr1,$arr2,$arr3); 預設是所有陣列都是升序排列,如果想對$arr2降序,並當作字串去比較,就要寫成:

array_multisort($arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);

每個array後面可以跟一個排序順序標誌或一個排序型別標誌,或者兩種標誌同時出現。但是每種排序標誌在每個陣列後面只能出現一個。

詳細如下:

排序順序標誌:

  • SORT_ASC - 按照上升順序排序(預設)

  • SORT_DESC - 按照下降順序排序

排序型別標誌:

  • SORT_REGULAR - 將專案按照通常方法比較(預設)

  • SORT_NUMERIC - 將專案按照數值比較

  • SORT_STRING - 將專案按照字串比較

三、最後是array_multisort有什麼實際作用。

我們通常有一些多維陣列需要排序:

$guys = Array
( 
 [0] => Array
        (
            [name] => jake
            [score] => 80
            [grade] => A
        )
 [1] => Array
        (
            [name] => jin
            [score] => 70
            [grade] => A
        )
 [2] => Array
        (
            [name] => john
            [score] => 80
            [grade] => A
        )
 [3] => Array
        (
            [name] => ben
            [score] => 20
            [grade] => B
        ) 
 )
例如我們想按成績倒序排列,如果成績相同就按名字的升序排列。
這時我們就需要根據$guys的順序多弄兩個陣列出來:
$scores = array(80,70,80,20);
$names = array('jake','jin','john','ben');
然後
array_multisort($scores, SORT_DESC, $names, );就行了
還能不能更靈活一點呢,每次想排序都要另外弄些陣列出來嗎?
其實在qeephp的helper_array類裡面已經封裝得很好,下面是它的兩個方法,需要的人自己修改一下就可以用了:
   
    static function sortByCol($array, $keyname, $dir = SORT_ASC)
    {
        return self::sortByMultiCols($array, array($keyname => $dir));
    }
   
    static function sortByMultiCols($rowset, $args)
    {
        $sortArray = array();
        $sortRule = '';
        foreach ($args as $sortField => $sortDir)
        {
            foreach ($rowset as $offset => $row)
            {
                $sortArray[$sortField][$offset] = $row[$sortField];
            }
            $sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
        }
        if (empty($sortArray) || empty($sortRule)) { return $rowset; }
        eval_r('array_multisort(' . $sortRule . '$rowset);');
        return $rowset;
    }