【问题标题】:Filter usernames in an array based on the highest score根据最高分过滤数组中的用户名
【发布时间】:2019-11-30 16:36:52
【问题描述】:

我们的平台上有一个在线小游戏,名字相似的用户,例如:UsernameUserNameusername 面对面。所有这一切都完美无缺,但现在我们正在添加一个排行榜,将您的数据从 PHP 数组中取出。

$positions = ConfrontationGame::getResults()->toArray();

那么$positions变量就是一个数组,结构如下:

$positions => array {

    [
        'username' => 'Exampleusername',
        'score' => '74'
    ],
    [
        'username' => 'ExampleUsername',
        'score' => '14'
    ],
    [
        'username' => 'exampleusername',  // WINNER
        'score' => '96'
    ]

}

我们使用这个数组来创建一个位置表,其中用户名相似(EmapleUsernameExampleusernameexampleusername)的用户彼此面对时应该只留下得分最高的那个,在这种情况下是获胜者exampleusername

这就是我们所拥有的:

$results_table = array_filter($positions, function($val, $key) {

        if($key === 'username' && in_array(strtolower($val), $positions)) {
            if($key === 'score') {
                // ...
                // What is done here?
            }        
        }

    }, ARRAY_FILTER_USE_BOTH);

【问题讨论】:

  • 使用 array_filter(),闭包返回 true 或 false 以包含或不包含在集合中。 array_reduce() 接受一个可选值,例如一个包含新信息的数组,最终返回。例如,如果您只想解释为用户名列表,请创建一个归约函数并将您的累加器仅包含您想要保留的用户名。

标签: php arrays array-filter


【解决方案1】:

这是看待它的一种方式。

<?php

$playersWithPosition = [[
    'username' => 'Exampleusername',
    'score' => '74'
],[
    'username' => 'ExampleUsername',
    'score' => '14'
],[
    'username' => 'exampleusername',  // WINNER
    'score' => '96'
]];

$leaderboard = static function(array $players) {
    $leaders = [];

    foreach($players as $player) {
        $leaders[(int) $player['score']] = $player['username'];
    }

    ksort($leaders);

    // Higher score is better, so reverse order.
    return array_values(array_reverse($leaders));
};

$leading = static function(array $players) use(&$leaderboard): ?string {
    return $leaderboard($players)[0] ?? null;
};

var_dump($leaderboard($playersWithPosition), $leading($playersWithPosition));

这给出了:

array(3) {
  [0]=>
  string(15) "exampleusername"
  [1]=>
  string(15) "Exampleusername"
  [2]=>
  string(15) "ExampleUsername"
}

string(15) "exampleusername"

https://3v4l.org/ICGZf

【讨论】:

  • 很好,但这会返回 3 个用户名,而不仅仅是得分最高的用户名
  • $leaderboard[0]
  • 基于返回其函数的数组并且与我的示例数组类似,获胜者是位置 [2] 中的 exampleusername 而不是位置 [0] 中的 ExampleUsername
  • @HéctorManuelMartínezDurán 我对其进行了修改以仅返回领导者。您可以做一个简单地比较分数的reducer,问题是如何使用排序算法保持参考。
  • @HéctorManuelMartínezDurán 然后添加array_reverse(),如果分数越高越好。
猜你喜欢
  • 2021-03-24
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2020-05-16
相关资源
最近更新 更多