Php 多条件稳定排序

Php 多条件稳定排序,php,Php,您好,我面临的问题是如何按不同的键对多维数组进行排序,例如按日期、按类别、按权重以任何特定顺序排序 我不能按mysql按功能排序这些数组,因为我必须在mysql输出数组(数据)上实现严格的业务逻辑 在实现业务逻辑后,我发现需要按以下类型排序的数组 日期asc、类别描述、重量asc 数组大小为10000或更多 我已经使用了usort函数,但它不能解决排序元素值相同时的固定排序问题 请帮忙 Array ( [0] => Array ( [cate

您好,我面临的问题是如何按不同的键对多维数组进行排序,例如按日期、按类别、按权重以任何特定顺序排序

我不能按mysql按功能排序这些数组,因为我必须在mysql输出数组(数据)上实现严格的业务逻辑

在实现业务逻辑后,我发现需要按以下类型排序的数组

日期asc、类别描述、重量asc

数组大小为10000或更多

我已经使用了usort函数,但它不能解决排序元素值相同时的固定排序问题

请帮忙

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:你甚至有一个不好的解决方案吗?谢谢你的帮助。我需要使用一个函数按日期、类别和重量排序。您的函数在这种情况下工作吗?这个例子说明了在一个函数中处理多个条件的想法。不要把它当作最终的工作产品,你的工作就是做一个。