Php 多条件稳定排序
您好,我面临的问题是如何按不同的键对多维数组进行排序,例如按日期、按类别、按权重以任何特定顺序排序 我不能按mysql按功能排序这些数组,因为我必须在mysql输出数组(数据)上实现严格的业务逻辑 在实现业务逻辑后,我发现需要按以下类型排序的数组 日期asc、类别描述、重量asc 数组大小为10000或更多 我已经使用了usort函数,但它不能解决排序元素值相同时的固定排序问题 请帮忙Php 多条件稳定排序,php,Php,您好,我面临的问题是如何按不同的键对多维数组进行排序,例如按日期、按类别、按权重以任何特定顺序排序 我不能按mysql按功能排序这些数组,因为我必须在mysql输出数组(数据)上实现严格的业务逻辑 在实现业务逻辑后,我发现需要按以下类型排序的数组 日期asc、类别描述、重量asc 数组大小为10000或更多 我已经使用了usort函数,但它不能解决排序元素值相同时的固定排序问题 请帮忙 Array ( [0] => Array ( [cate
Array
(
[0] => Array
(
[categorie] => xyz
[date] => 2012-12-08 19:30
[weight] => 3
[row_id] => 125812
[searchtype] => show
[uitgespeeld] => 0
)
[1] => Array
(
[categorie] => show
[date] => 2012-12-10 20:15
[weight] => 3
[row_id] => 125816
[searchtype] => show
[uitgespeeld] => 0
)
[2] => Array
(
[categorie] => abc
[date] => 2012-12-13 20:30
[weight] => 3
[row_id] => 119151
[searchtype] => show
[uitgespeeld] => 0
)
.......
)
我用于排序的代码
usort($temp_group_data, array('className','cmp_weight'));
usort($temp_group_data, array('className','cmp_date'));
function cmp_weight($a, $b) {
if (($a['weight']==$b['weight']) ) {
return 0;
} else if ($a['weight'] >$b['weight']) {
return -1;
} else {
return 1;
}
}
function cmp_date($a, $b) {
if (($a['date']==$b['date']) ) {
return 0;
} else if (strtotime($a['date']) >strtotime($b['date'])) {
return -1;
} else {
return 1;
}
}
您必须在一个函数中完成此操作,现在第二个排序将覆盖第一个函数中所做的更改
function multicompare($a,$b){
$criteria = array(
'date' => 'asc',
'category' => 'desc',
'weight' => 'asc'
);
foreach($criteria as $what => $order){
if($a[$what] == $b[$what]){
continue;
}
return (($order == 'desc')?-1:1) * strcmp($a[$what], $b[$what]);
}
return 0;
}
从问题的最后一部分来看,问题有两个方面:
foreach ($a as $key => &$item) {
$item = array($item, $key); // add array index as secondary sort key
}
usort($a, 'mysort'); // sort it
// undecorate
foreach ($a as $key => &$item) {
$item = $item[0]; // remove decoration from previous step
}
以下是一体式排序功能:
function mysort($a, $b)
{
if ($a[0]['date'] != $b[0]['date']) {
return $a[0]['date'] < $b[0]['date'] ? -1 : 1; // ASC
} elseif ($a[0]['category'] != $b[0]['category']) {
return $a[0]['category'] < $b[0]['category'] ? 1 : -1; // DESC
} elseif ($a[0]['weight'] != $b[0]['weight']) {
return $a[0]['weight'] < $b[0]['weight'] ? -1 : 1; // ASC
} else {
return $a[1] < $b[1] ? -1 : 1; // ASC
}
}
函数mysort($a,$b)
{
如果($a[0]['date']!=$b[0]['date']){
返回$a[0]['date']<$b[0]['date']?-1:1;//ASC
}elseif($a[0]['category']!=$b[0]['category']){
返回$a[0]['category']<$b[0]['category']?1:-1;//说明
}elseif($a[0]['weight']!=$b[0]['weight']){
返回$a[0]['weight']<$b[0]['weight']?-1:1;//ASC
}否则{
返回$a[1]<$b[1]?-1:1;//ASC
}
}
stackoverflow上有多个答案。你为什么不看看这些?给我们你使用的usort
代码,我们会看到的。我已经看到了,但我正在寻找一些好的解决方案,使用最小处理,因为数组大小是以千为单位的。@praveen:你甚至有一个不好的解决方案吗?谢谢你的帮助。我需要使用一个函数按日期、类别和重量排序。您的函数在这种情况下工作吗?这个例子说明了在一个函数中处理多个条件的想法。不要把它当作最终的工作产品,你的工作就是做一个。