为了账号安全,请及时绑定邮箱和手机立即绑定

对具有棘手条件的多维数组进行排序

对具有棘手条件的多维数组进行排序

PHP
慕工程0101907 2022-01-14 15:41:01
我是 php 的新手。我正在尝试对具有某些条件的多维数组进行排序,但我不知道从哪里开始。用户数组Array(    [0] => Array        (            [uid] => 1            [Fname] => Kcir            [Lname] => Nayr            [wins] => 12            [scoreGuess] => 45            [totalScore] => 26        )    [1] => Array        (            [uid] => 2            [Fname] => Doe            [Lname] => John            [wins] => 12            [scoreGuess] => 35            [totalScore] => 26        )    [2] => Array        (            [uid] => 3            [Fname] => Greg            [Lname] => Cuenca            [Nickname] => Greg            [wins] => 11            [scoreGuess] => 21            [totalScore] => 26        )    [3] => Array        (            [uid] => 4            [Fname] => Kenneth            [Lname] => Agee            [wins] => 12            [scoreGuess] => 34            [totalScore] => 26        ))首先,我需要通过wins按降序对用户进行排序,然后如果有用户与wins绑定,则绑定用户将通过scoreGuess排序,但有一个条件。如果scoreGuess是totalScore上最接近的,那么该用户将是最高的。例如:用户1、2和3并列获得12胜,总得分为26。用户 1的 scoreGuess 为45用户 2的 scoreGuess 为35用户 4的 scoreGuess 为34所以最高的是用户 4,因为他的 scoreGuess 最接近。我已经尝试过此代码,但无法正常工作。function compareUsers($a, $b){            if($a['wins'] > $b['wins'])            {                return -1;            }            else if ($a['wins'] == $b['wins']) {                $a_diff = (int) $a['totalScore'] - (int)$a['scoreGuess'];                $b_diff = (int) $b['totalScore'] - (int) $b['scoreGuess'];                if ( $a_diff >= 0 && $b_diff >= 0 ) {                    if ( $a_diff < $b_diff ) {                        return -1;                    }                } else if ( $a_diff >= 0 && $b_diff < 0 ) {                    return 0;                } else {                    return 1;                }            }            else            {                return 1;            }}usort($users, "compareUsers");
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

好的,你可以让它更简单,如下所示:


usort($arr,function($data1,$data2){

    if($data1['wins'] != $data2['wins']) return -1 * ($data1['wins'] - $data2['wins']);

    return abs($data1['scoreGuess'] - $data1['totalScore']) - abs($data2['scoreGuess'] - $data2['totalScore']);

});

演示: https ://3v4l.org/KCuf9


我们看看winsset 是否与其他 set 相等wins。

如果它们不相等,我们返回两者的差乘以-1降序排列。

scoreGuess如果它们相等,我们取和之间差异的绝对值之差totalScore。


查看完整回答
反对 回复 2022-01-14
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

尝试使用以下解决方案usort,当获胜次数不同时,按获胜次数排序。当获胜次数相等时,使用 totalScore 和 scoreGuess 之间的差值进行排序。


$array = [

    0 => [    

        'uid' => 1,

        'Fname' => 'Kcir',

        'Lname' => 'Nayr',

        'wins' => 12,

        'scoreGuess' => 45,

        'totalScore' => 26,

    ],

    1 => [

        'uid' => 2,

        'Fname' => 'Doe',

        'Lname' => 'John',

        'wins' => 12,

        'scoreGuess' => 35,

        'totalScore' => 26,

    ],

    2 => [

        'uid' => 3,

        'Fname' => 'Greg',

        'Lname' => 'Cuenca',

        'Nickname' => 'Greg',

        'wins' => 11,

        'scoreGuess' => 21,

        'totalScore' => 26,

    ],

    3 => [

        'uid' => 4,

        'Fname' => 'Kenneth',

        'Lname' => 'Agee',

        'wins' => 12,

        'scoreGuess' => 34,

        'totalScore' => 26,

    ],

];


usort($array, function($prev, $next) {

     if ($next['wins'] == $prev['wins']) {

          return abs($prev['scoreGuess'] - $prev['totalScore']) <=> abs($next['scoreGuess'] - $next['totalScore']);

     } else {

          return $next['wins'] <=> $prev['wins'];

     }

});

结果是:


Array

(

    [0] => Array

        (

            [uid] => 4

            [Fname] => Kenneth

            [Lname] => Agee

            [wins] => 12

            [scoreGuess] => 34

            [totalScore] => 26

        )


    [1] => Array

        (

            [uid] => 2

            [Fname] => Doe

            [Lname] => John

            [wins] => 12

            [scoreGuess] => 35

            [totalScore] => 26

        )


    [2] => Array

        (

            [uid] => 1

            [Fname] => Kcir

            [Lname] => Nayr

            [wins] => 12

            [scoreGuess] => 45

            [totalScore] => 26

        )


    [3] => Array

        (

            [uid] => 3

            [Fname] => Greg

            [Lname] => Cuenca

            [Nickname] => Greg

            [wins] => 11

            [scoreGuess] => 21

            [totalScore] => 26

        )


)



查看完整回答
反对 回复 2022-01-14
  • 2 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号