我正在寻找一种方法来对数组进行排序,基于每行中的信息,基于某些单元格中的信息,我将其称为列。
每一行都有必须根据以下优先级排序的列: timetime、lapcount和timestamp。
每一列都包含以下信息: split1、split2、split3、laptime、lapcount、timestamp。
以百分之一秒为单位的时间。(1分23秒45或1分23秒&45百分之一是8345。)Lapcount是一个简单的无符号小整型或无符号字符。时间戳是unix纪元。
最低的延时应该是在这种情况下获得更好的地位。如果两个人的时间相等,那么时间戳将被用来在这种类型中给出更好的地位。如果两个人的时间戳相等,那么在这种情况下,失误次数较少的人会获得更好的地位。
更好的站位,我的意思是更接近数组的顶部,更接近0的索引,在那里它是一个数值数组。
我认为php内置的array sorting函数可以通过回调来做到这一点,我想知道像这样的加权排序的最好方法是什么。
<?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);
?>发布于 2010-03-08 11:10:50
你想要的是一个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);发布于 2010-03-08 12:24:56
这是未经测试的,我想使用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;
});https://stackoverflow.com/questions/2398907
复制相似问题