【问题标题】:Sort array by key value and then get 5 highest and lowest values in array按键值对数组进行排序,然后得到数组中的 5 个最高和最低值
【发布时间】:2018-07-12 06:20:34
【问题描述】:

我有一个名为“playersArray”的数组,如下所示:

Array (
    [0] => Array ( [name] => Joe [holders] => 0 )
    [1] => Array ( [name] => Bob [holders] => 100 )
    [2] => Array ( [name] => Jake [holders] => 100 )
    [3] => Array ( [name] => Mike [holders] => 100 )
    [4] => Array ( [name] => Tim [holders] => -0.0145 )
    [5] => Array ( [name] => Frank[holders] => 100 ) 
    [6] => Array ( [name] => Scott [holders] => 0.0583 ) 
    [7] => Array ( [name] => Doug[holders] => 0.1308 ) 
    [8] => Array ( [name] => Tommy [holders] => 0.2516 ) 
    [9] => Array ( [name] => Eric [holders] => 100 ) 
)

我有一个按“持有人”值对这个数组进行排序的函数:

function compareHolders($a, $b) {

    $aPoints < $a['holders'];
    $bPoints < $b['holders'];

    return strcmp($aPoints, $bPoints);

}

我遍历另一个数组来创建这个数组:

foreach ($players as $player) {
    $player['name'] = $athlete['name'];
    $player['holders'] = $total_result_yesterday;
    $playersArray[] = $player;
}

我正在尝试按“持有人”值对数组进行排序:

usort($playersArray, 'compareHolders');

print_r($playersArray);

最后,我试图在新排序的数组中获取 5 个最高和 5 个最低的“持有人”值:

$first_5_players = array_slice($playersArray, 0, 5, true);
$last_5_players = array_slice($playersArray, -5);

但是,排序工作不正常。到期的值未按需要按顺序显示。如何让排序正常工作?谢谢!

【问题讨论】:

    标签: php arrays sorting multidimensional-array


    【解决方案1】:

    您的排序函数compareHolders 不正确。 $aPoints$bPoints 未定义。由于 holders 键的值是数字,因此您可以使用比较运算符。尝试执行以下操作:

    function compareHolders($a, $b) {
        if ($a['holders'] == $b['holders']) {
            // return 0 if equal
            return 0;
        }
        return ($a['holders'] > $b['holders']) ? -1 : 1;
    }
    

    【讨论】:

    • 这是对float排序的正确方法,使用字符串比较是大错特错
    【解决方案2】:

    您实际上并没有比较compareHolders() 中的两个值,因为您没有声明$aPpoints$bPoints

    这应该可行:

    function compareHolders($a, $b) {
    
        $aPoints = $a['holders'];
        $bPoints = $b['holders'];
    
        return strcmp($aPoints, $bPoints);
    
    }
    

    或者你也可以直接返回:

    return strcmp($a['holders'], $b['holders']);
    

    然后你可以去掉strcmp(),因为你不是在比较字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多