0

嗨,我在按不同键对多维数组进行排序时遇到问题,例如按日期、按类别、按任何特定顺序按重量。

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

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

日期升序,类别降序,重量升序。

数组的大小为 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;
    }
}
4

2 回答 2

2

您必须在一个函数中执行此操作,现在第二次排序会覆盖第一次所做的更改。

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;
}
于 2012-12-02T20:32:56.167 回答
0

从问题的最后一部分来看,问题有两个方面:

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

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

两个步骤合而为一;首先,您使用它们出现在原始数组中的索引来“装饰”数组:

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
    }
}
于 2012-12-03T02:27:30.483 回答