具有多种条件的稳定排序

时间:2012-12-02 19:59:52

标签: php

您好我在使用不同的键排序多维数组时遇到问题,例如按日期,按类别,按重量按任何特定顺序排序。

我无法通过mysql命令按顺序排序这些数组,因为我必须在mysql输出数组(数据)上实现一个严格的业务逻辑..

在实现业务逻辑后,我找到了需要按

排序的以下类型的数组

日期asc,类别desc,权重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;
    }
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

问题是双重的,从问题的最后部分来看:

  1. 所有条件必须同时评估,而不是连续评估。

  2. 如果两个值相同(即原始订单),您需要稳定排序以保留排序

  3. 一个步骤都是这样的;首先,使用它们在原始数组中出现的索引“装饰”数组:

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