[1,3,1,5,6,2,6,7,8]-6ren">
gpt4 book ai didi

php - 按地点对赛车手/玩家进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:37:02 25 4
gpt4 key购买 nike

我有一些以下列形式呈现的赛车手的数据:

    array(        array(name => "the first racer", places => [1,3,1,5,6,2,6,7,8]),        array(name => "the second racer", places => [2,4,2,5,7])        ...     )

建议对他们进行排序的最佳方式,以便第一批参赛者拥有更好的位置。例如,如果第一个赛车手至少有一个第一名而另一个没有,则第一个在列表中更高。如果他们都获得了第一名,则比较第一名的数量。如果数量也相等,则比较第二位,依此类推。

我的解决方案(看起来不是很优雅。也许可以更简单地完成):

    $racers = array(        array('name' => "the first racer", 'places' => [1,3,1,5,6,2,6,7,8,9]),        array('name' => "the second racer", 'places' => [1,3,1,5,6,2,6,7,8]),        array('name' => "the third racer", 'places' => [2,3,2,5,7,10]),        array('name' => "the fourth racer", 'places' => [2,3,10,6,6,10]),        array('name' => "the fifth", 'places' => [2,3,2,5,7,10,1]),    );    usort($racers, function($prev, $next) {        // order places for every racer        sort($prev['places']);        sort($next['places']);        //compare each place with each other         foreach ($prev['places'] AS $key => $prevRacerPlace) {            // if all values are equal, we compare the number of races            if (!isset($next['places'][$key])) {                return -1;            }            $nextRacerPlace = $next['places'][$key];            $diff = $prevRacerPlace - $nextRacerPlace;            if ($diff !== 0) {                return $diff;            }        }        // if all values are equal, we compare the number of races        if (count($next['places']) > count($prev['places'])) {            return 1;        }    });    var_dump($racers);

最佳答案

在自定义排序之前做一些准备是非常好的。所以我们避免在 lambda 函数中使用嵌套排序:

foreach ($racers as $index => $racer) {
$racers[$index]['sorted_places'] = $racer['places'];
sort($racers[$index]['sorted_places']);
}

在排序 lambda 函数中,我们比较准备好的排序位置的头部并返回第一个定义的值。如果赛车手 B 的第一名成绩优于 A,则返回 1。如果赛车手 A 的第一名成绩优于 B ,返回-1。在相同的结果下继续检查下一个最高位置。

usort($racers, function ($a, $b) {
unset($value);
do {
$topA = array_shift($a['sorted_places']);
$topB = array_shift($b['sorted_places']);

if (is_null($topA) && is_null($topB)) {
$value = 0;
} elseif (is_null($topA)) {
$value = 1;
} elseif (is_null($topB)) {
$value = -1;
} elseif ($topA > $topB) {
$value = 1;
} elseif ($topA < $topB) {
$value = -1;
}
} while (!isset($value));
return $value;
});

关于php - 按地点对赛车手/玩家进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40208693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com