我正在寻找一种基于每行中的信息对数组进行排序的方法,基于某些单元格中的信息,我将其称为列。
每一行都有必须根据优先级排序的列: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);
?>
答案 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;
});