php 根据指定的键对多维数组进行排序

时间:2020-12-11 23:39:46

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

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

$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;
}