首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按多个值对数组进行排序,并根据列数据确定排序的优先级

问按多个值对数组进行排序,并根据列数据确定排序的优先级
EN

Stack Overflow用户
提问于 2010-03-08 10:08:17
回答 2查看 203关注 0票数 0

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

每一行都有必须根据以下优先级排序的列: timetime、lapcount和timestamp。

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

以百分之一秒为单位的时间。(1分23秒45或1分23秒&45百分之一是8345。)Lapcount是一个简单的无符号小整型或无符号字符。时间戳是unix纪元。

最低的延时应该是在这种情况下获得更好的地位。如果两个人的时间相等,那么时间戳将被用来在这种类型中给出更好的地位。如果两个人的时间戳相等,那么在这种情况下,失误次数较少的人会获得更好的地位。

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

我认为php内置的array sorting函数可以通过回调来做到这一点,我想知道像这样的加权排序的最好方法是什么。

代码语言:javascript
复制
<?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);

?>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-08 11:10:50

你想要的是一个Schwartzian transform。创建一个新数组,将排序依据的值作为键,将原始值作为值,按键对数组进行排序,然后剥离键。

编辑:

快速实现:

代码语言:javascript
复制
$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);
票数 2
EN

Stack Overflow用户

发布于 2010-03-08 12:24:56

这是未经测试的,我想使用php 5.3。但是,您可以在没有匿名函数的情况下执行相同的操作。您不需要像我那样对每个列比较使用单独的函数。但是,看起来您实际上是在尝试复制数据库对多列进行排序的方式,所以我给出了一个接近它的方法。

代码语言:javascript
复制
$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;
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2398907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档