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

我是 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");

慕工程0101907
浏览 231回答 2
2回答

aluckdog

好的,你可以让它更简单,如下所示:usort($arr,function($data1,$data2){&nbsp; &nbsp; if($data1['wins'] != $data2['wins']) return -1 * ($data1['wins'] - $data2['wins']);&nbsp; &nbsp; return abs($data1['scoreGuess'] - $data1['totalScore']) - abs($data2['scoreGuess'] - $data2['totalScore']);});演示: https ://3v4l.org/KCuf9我们看看winsset 是否与其他 set 相等wins。如果它们不相等,我们返回两者的差乘以-1降序排列。scoreGuess如果它们相等,我们取和之间差异的绝对值之差totalScore。

慕勒3428872

尝试使用以下解决方案usort,当获胜次数不同时,按获胜次数排序。当获胜次数相等时,使用 totalScore 和 scoreGuess 之间的差值进行排序。$array = [&nbsp; &nbsp; 0 => [&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; 'uid' => 1,&nbsp; &nbsp; &nbsp; &nbsp; 'Fname' => 'Kcir',&nbsp; &nbsp; &nbsp; &nbsp; 'Lname' => 'Nayr',&nbsp; &nbsp; &nbsp; &nbsp; 'wins' => 12,&nbsp; &nbsp; &nbsp; &nbsp; 'scoreGuess' => 45,&nbsp; &nbsp; &nbsp; &nbsp; 'totalScore' => 26,&nbsp; &nbsp; ],&nbsp; &nbsp; 1 => [&nbsp; &nbsp; &nbsp; &nbsp; 'uid' => 2,&nbsp; &nbsp; &nbsp; &nbsp; 'Fname' => 'Doe',&nbsp; &nbsp; &nbsp; &nbsp; 'Lname' => 'John',&nbsp; &nbsp; &nbsp; &nbsp; 'wins' => 12,&nbsp; &nbsp; &nbsp; &nbsp; 'scoreGuess' => 35,&nbsp; &nbsp; &nbsp; &nbsp; 'totalScore' => 26,&nbsp; &nbsp; ],&nbsp; &nbsp; 2 => [&nbsp; &nbsp; &nbsp; &nbsp; 'uid' => 3,&nbsp; &nbsp; &nbsp; &nbsp; 'Fname' => 'Greg',&nbsp; &nbsp; &nbsp; &nbsp; 'Lname' => 'Cuenca',&nbsp; &nbsp; &nbsp; &nbsp; 'Nickname' => 'Greg',&nbsp; &nbsp; &nbsp; &nbsp; 'wins' => 11,&nbsp; &nbsp; &nbsp; &nbsp; 'scoreGuess' => 21,&nbsp; &nbsp; &nbsp; &nbsp; 'totalScore' => 26,&nbsp; &nbsp; ],&nbsp; &nbsp; 3 => [&nbsp; &nbsp; &nbsp; &nbsp; 'uid' => 4,&nbsp; &nbsp; &nbsp; &nbsp; 'Fname' => 'Kenneth',&nbsp; &nbsp; &nbsp; &nbsp; 'Lname' => 'Agee',&nbsp; &nbsp; &nbsp; &nbsp; 'wins' => 12,&nbsp; &nbsp; &nbsp; &nbsp; 'scoreGuess' => 34,&nbsp; &nbsp; &nbsp; &nbsp; 'totalScore' => 26,&nbsp; &nbsp; ],];usort($array, function($prev, $next) {&nbsp; &nbsp; &nbsp;if ($next['wins'] == $prev['wins']) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return abs($prev['scoreGuess'] - $prev['totalScore']) <=> abs($next['scoreGuess'] - $next['totalScore']);&nbsp; &nbsp; &nbsp;} else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $next['wins'] <=> $prev['wins'];&nbsp; &nbsp; &nbsp;}});结果是:Array(&nbsp; &nbsp; [0] => Array&nbsp; &nbsp; &nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [uid] => 4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Fname] => Kenneth&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Lname] => Agee&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [wins] => 12&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [scoreGuess] => 34&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [totalScore] => 26&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; [1] => Array&nbsp; &nbsp; &nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [uid] => 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Fname] => Doe&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Lname] => John&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [wins] => 12&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [scoreGuess] => 35&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [totalScore] => 26&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; [2] => Array&nbsp; &nbsp; &nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [uid] => 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Fname] => Kcir&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Lname] => Nayr&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [wins] => 12&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [scoreGuess] => 45&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [totalScore] => 26&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; [3] => Array&nbsp; &nbsp; &nbsp; &nbsp; (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [uid] => 3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Fname] => Greg&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Lname] => Cuenca&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Nickname] => Greg&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [wins] => 11&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [scoreGuess] => 21&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [totalScore] => 26&nbsp; &nbsp; &nbsp; &nbsp; ))
打开App,查看更多内容
随时随地看视频慕课网APP