这个问题有点旧,但会留下答案在这里为将来。
从php.net-Multisort 函数我们可以使用下面的代码;
$data= [['volume' => 67, 'edition' => 2],['volume' => 85, 'edition' => 6],...];
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
以上是对手动更改排序列的数据进行静态排序。
对于更具动态性和鲁棒性的示例,请在下面考虑;
假设我有以下数据;
$data = [[1, 'Amanda', 'Wright', '[email protected]', 'Female', '135.114.57.89', 31237],
[2, 'Theresa', 'Larson', '[email protected]', 'Female', '207.108.96.210', 91011],
[3, 'Walter', 'Kennedy', '[email protected]', 'Male', '199.147.223.56', 50114],
[4, 'Andrea', 'Richards', '[email protected]', 'Female', '230.195.124.95', 76489],
[5, 'Carol', 'Jones', '[email protected]', 'Female', '250.197.111.90', 56501],
[6, 'Alice', 'Freeman', '[email protected]', 'Female', '52.195.252.131', 77170],
[7, 'Gerald', 'Fisher', '[email protected]', 'Male', '81.2.22.62', 75625],....]
如果我们需要在上述阵列数据开箱排序,那么我们就可以在阵列中使用的语法设置排序订单;
$qTable[$index]=$sort_order;
E.g. $qTable=[1=>'asc',4=>'desc',3=>'asc'];
这意味着对第1列ASC,第4列DESC和第3列ASC进行排序。 然后我们可以使用下面的函数对我们的多维数据库数据进行排序;
function sortMulti($data, $orders)
{
$args = [];
foreach ($data as $key => $row) {
foreach ($orders as $index => $order) {
if (!isset($row[$index])) continue; //Ignore if column does'nt exist
$args[$index]['d'][$key] = $row[$index]; //Get all values within the column
$args[$index]['o'] = 'desc' == strtolower($order) ? SORT_DESC : SORT_ASC; //Get the Sort order 'ASC' is the default
}
}
$p = [];
//Below we need to organize our entries as arguments for array_multisort
foreach ($args as $arg) {
$p[] = $arg['d'];
$p[] = $arg['o'];
//Below we need to check if column contains only numeric or not.
//If all values are numeric, then we use numeric sort flag, otherwise NATURAL
//Manipulate for more conditions supported
$p[] = count($arg['d']) == count(array_filter($arg['d'], 'is_numeric')) ? SORT_NUMERIC : SORT_NATURAL;
}
$p[] = &$data; //Pass by reference
call_user_func_array('array_multisort', $p); //Call Php's own multisort with parameters in required order.
return $data; //Our final array sorted.
}
然后我们可以如下使用它;
$data=[[...],[...],...];
$order=[1=>'asc',4=>'desc',3=>'asc'];
$sorted=sortMulti($data,$order);
对于关键值阵列数据E.g. $data=[['c1'=>1212,'c2'=>'mynames'],...];
用作$order=['c1'=>'desc','c10'=>'asc'];
我测试了以上的1000个记录的阵列的顺序。 希望它可以帮助别人。
注意:如果您的数据来自数据库,请在选择时使用数据库的排序方法。 – DisgruntledGoat 2010-03-11 17:18:25
Duplicate:http://stackoverflow.com/questions/2122062/sort-multidimensional-array-of-objects – 2010-03-11 17:18:42
@DisgruntledGoat它不是来自数据库。我只是以此为例。它实际上来自第三方XML。 – Camsoft 2010-03-11 17:25:50