PHP多維陣列排序函數 array_multisort() 執行個體講解

來源:互聯網
上載者:User

一、先看最簡單的情況。

有兩個數組:

$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為另一資料行,5, 4, 8 另一行。

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(
    array(
        'name' => 'jake',
        'score' => 80,
        'grade' => 'A'
    ),
    array(
        'name' => 'jin',
        'score' => 70,
        'grade' => 'A'
    ),
    array(
        'name' => 'john',
        'score' => 80,
        'grade' => 'A'
    ),
    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, $guys);

就行了。

還能不能更靈活一點呢,每次想排序都要另外弄些數組出來嗎?

其實可以經封裝幾個函數:

<?php
/**
 * 根據指定的鍵對數組排序
 *
 * 用法:
 * <code>
 * $rows = array(
        array('id' => 1, 'value' => '1-1', 'parent' => 1),
        array('id' => 2, 'value' => '2-1', 'parent' => 1),
        array('id' => 3, 'value' => '3-1', 'parent' => 1),
        array('id' => 4, 'value' => '4-1', 'parent' => 2),
        array('id' => 5, 'value' => '5-1', 'parent' => 2),
        array('id' => 6, 'value' => '6-1', 'parent' => 3),
    );
 *
 * $rows = list_sortByCol($rows, 'id', SORT_DESC);
 * dump($rows);
 * // 輸出結果為:
 * // array(
 * // array('id' => 6, 'value' => '6-1', 'parent' => 3),
 * // array('id' => 5, 'value' => '5-1', 'parent' => 2),
 * // array('id' => 4, 'value' => '4-1', 'parent' => 2),
 * // array('id' => 3, 'value' => '3-1', 'parent' => 1),
 * // array('id' => 2, 'value' => '2-1', 'parent' => 1),
 * // array('id' => 1, 'value' => '1-1', 'parent' => 1),
 * // )
 * </code>
 *
 * @param array $array 要排序的數組
 * @param string $keyname 排序的鍵
 * @param int $dir 排序方向
 * @return array 排序後的數組
*/
function list_sortByCol($array, $keyname, $dir = SORT_ASC)
{
    return list_sortByMultiCols($array, array($keyname => $dir));
}

/**
* 將一個二維數組按照多個列進行排序,類似 SQL 陳述式中的 ORDER BY
*
* 用法:
* <code>
* $rows = list_sortByMultiCols($rows, array(
    'parent' => SORT_ASC,
    'name' => SORT_DESC,
* ));
* </code>
*
* @param array $rowset 要排序的數組/行集
* @param array $args 排序的鍵
*
* @return array 排序後的數組
*/
function list_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('array_multisort(' . $sortRule . '$rowset);');

    return $rowset;
}



PHP二維數組排序(sort_array)

/**
 * 對二維數組進行排序
 * 類比 資料表記錄按欄位排序
 *
 * <code>
 *  @list_sort($list, $get['orderKey'], $get['orderType']);
 * </code>
 * @param array $array 要排序的數組
 * @param string $orderKey 排序關鍵字/欄位
 * @param string $orderType 排序方式,'asc':升序,'desc':降序
 * @param string $orderValueType 排序欄位實值型別,'number':數字,'string':字串
 */
function list_sort(&$array, $orderKey, $orderType = 'asc', $orderValueType = 'string')
{
    if (is_array($array))
    {
        $orderArr = array();
        foreach ($array as $val)
        {
            $orderArr[] = $val[$orderKey];
        }
        $orderType = ($orderType == 'asc') ? SORT_ASC : SORT_DESC;
        $orderValueType = ($orderValueType == 'string') ? SORT_STRING : SORT_NUMERIC;
        array_multisort($orderArr, $orderType, $orderValueType, $array);
    }
}

應用:

@sort_array($list, $get['sort'], $get['order'], "string");

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.