He元素

Don't be shy just try!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

根据指定的键对多维数组排序,可以按照多个键排序

我们通常有一些多维数组需要排序:

$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'
    )
);

例如我们想按成绩倒序排列,如果成绩相同就按名字的升序排列。

我们就可以用下面这个函数进行排序:

如果仅按照score排序:

$rows = list_orderByMultiCols($rows, array('score' => 'SORT_DESC'));

如果仅按照score,name排序:

$rows = list_orderByMultiCols($rows, array('score' => 'SORT_DESC', 'name' => 'SORT_ASC'));

其中用到了array_multisort函数:

他的排序方式有:SORT_ASC 升序,SORT_DESC 倒序

 

具体函数代码如下:

/*
* @param array $rowset 要排序的数组/行集
* @param array $args 排序的键
*
* @return array 排序后的数组
*/
function list_orderByMultiCols($rowset, $args)
{
    $orderArray = array();
    $orderRule = '';

    foreach ($args as $orderField => $orderDir)
    {
        foreach ($rowset as $offset => $row)
        {
            $orderArray[$orderField][$offset] = $row[$orderField];
        }
        $orderRule .= '$orderArray[\'' . $orderField . '\'], ' . $orderDir . ', ';
    }

    if (empty($orderArray) || empty($orderRule))
    {
        return $rowset;
    }
    eval('array_multisort(' . $orderRule . '$rowset);');

    return $rowset;
}

 

posted on 2016-04-07 13:12  He元素  阅读(650)  评论(0编辑  收藏  举报