亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對具有棘手條件的多維數組進行排序

對具有棘手條件的多維數組進行排序

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 關注
  • 194 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號