按更多单值排序数组,并根据列数据优先排序

时间:2010-03-08 02:08:17

标签: php arrays sorting

我正在寻找一种基于每行中的信息对数组进行排序的方法,基于某些单元格中的信息,我将其称为列。

每一行都有必须根据优先级排序的列:timetime,lapcount&时间戳。

每个栏目都包含以下信息:split1,split2,split3,laptime,lapcount,timestamp。

如果以百分之一秒为单位(1:23.45或1分钟,23秒和45百分位是8345.)Lapcount是一个简单的无符号微小int或unsigned char。时间戳是unix时代。

最低的片段应该是在这种情况下获得更好的地位。如果两个人的人口相等,那么时间戳将用于在这种情况下提供更好的地位。如果两个人的时间戳相等,那么圈数较少的人就会在这种情况下获得更好的地位。

通过更好的站立,我的意思是更接近数组的顶部,更接近零的索引,在那里它是一个数值数组。

我认为php中内置的array sorting函数可以通过回调实现这一点,我想知道对于像这样的加权排序最好的approch是什么。

<?php

    $racers = array('Dygear', 'filur', 'glyphon', 'AndroidXP', 'HorsePower', 'Becky Rose', 'kanutron', 'Victor');

    foreach ($racers as $racer)
        $query[$racer] = unserialize(file_get_contents('http://lfsworld.net/pubstat/get_stat2.php?version=1.4&ps=1&idk=35cP2S05Cvj3z7564aXKyw0Mqf1Hhx7P&s=2&action=pb&racer='.urlencode($racer)));

    foreach ($query as $racer => $data)
    {
        foreach ($data as $row)
        {
            if ($row['track'] == '000' && $row['car'] == 'FOX')
                $sortArray[$racer] = $row;
        }
    }

    # Sort the Array $sortArray

    var_dump($sortArray);

?>

2 个答案:

答案 0 :(得分:2)

你想要的是Schwartzian transform。创建一个新数组,其值为按键排序,原始值为值,按键对数组进行排序,然后去掉键。

修改

快速实施:

$times = Array(
  Array('val1' => 1, 'val2' => 3, 'val3' => 8),
  Array('val1' => 1, 'val2' => 2, 'val3' => 5),
  Array('val1' => 3, 'val2' => 8, 'val3' => 6),
  Array('val1' => 2, 'val2' => 2, 'val3' => 1),
  Array('val1' => 4, 'val2' => 7, 'val3' => 3)
);

$timesdec = Array();
foreach($times as $time)
{
  $timesdec[sprintf('%010d%010d', $time['val1'], $time['val3'])] = $time;
}

ksort($timesdec);
$newtimes = array_values($timesdec);
var_dump($newtimes);

答案 1 :(得分:1)

这是未经测试的,我觉得使用php 5.3。但是,您可以在没有匿名函数的情况下执行相同操作。您并不需要像我一样为每个列比较使用单独的函数。但是,似乎你真的想要复制数据库对多个列进行排序的方式,所以我给你一些接近它的东西。

$comparatorSequence = array(
    function($a, $b) {
        return $a['laptime'] - $b['laptime'];
    }
  , function($a, $b) {
        return $a['timestamp'] - $b['timestamp'];
    }
  , function($a, $b) {
        return $a['lapcount'] - $b['lapcount'];
    }
);

usort($theArray, function($a, $b) use ($comparatorSequence) {
    foreach ($comparatorSequence as $cmpFn) {
        $diff = call_user_func($cmpFn, $a, $b);
        if ($diff !== 0) {
            return $diff;
        }
    }
    return 0;
});