2010-03-08 36 views
0

我正在寻找一种基于每行信息对数组进行排序的方法,该方法基于某些单元格中的信息,我会呼叫专栏。通过更多的一个值对数组进行排序并根据列数据对排序进行优先排序

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

每列包含以下信息:split1,split2,split3,laptime,lapcount,timestamp。

laptime如果在百分之一秒。 (1:23.45或1分钟,23秒& 45百分之一是8345.)Lapcount是一个简单的无符号微小int或无符号字符。时间戳是unix时代。

最低的瘦身应该是在这种情况下获得更好的地位。如果两个人的平等程度相同,那么时间戳将被用于提供这种更好的地位。如果两个人的时间戳相同,那么在这种情况下,拥有较少计数的人就会更好。

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

我认为功能内置到PHP可以做到这一点与回调,我想知道什么是最好的方式是这样的加权排序。

<?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); 

?> 
+1

Btw-如果你提供一些样本数据,你可能会得到更多的答案,因为人们可以很容易地测试。使用var_export(),以便您可以方便的格式发布相关数据的小样本。 – goat

+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); 
+0

希望得到一个示例实现。因为,我无法理解这一点。 –

+0

所以,从本质上讲,你所做的就是把数字合在一起,希望最小的数值是最正确的。 Intresting。 –

+0

从一个足够大的常量中减去将允许您按照降序排序。 –

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; 
}); 
+0

一个有趣的解决方案。谢谢你的帖子。 –

相关问题