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

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

使用 usort ABC 值對 PHP 阿雷進行排序

使用 usort ABC 值對 PHP 阿雷進行排序

PHP
小唯快跑啊 2022-09-17 22:02:05
請幫助完成以下示例代碼。我正在嘗試進行排序,使“B”在數組中排名最后。我已經嘗試了很多方法。最初我和烏索特一起工作。但是為了調試,我已將其簡化為usort。<?php$array = json_decode('[    {        "id": "222",        "name": "A",        "shouldgolast": "N"    },    {        "id": "261",        "name": "B",        "shouldgolast": "Y"    },    {        "id": "262",        "name": "C",        "shouldgolast": "N"    }]', true);usort($array, "sortF");foreach ($array as $details) {    echo $details["name"]."\n";}function sortF($a, $b){    if($a['shouldgolast'] == "Y"){        return 1;    }else if($b['shouldgolast'] == "Y"){        return 1;    }    return 0;}?>上面的輸出是BAC我希望B是最后一個。測試鏈接: https://www.tehplayground.com/DzqhjFq6lK9Zq9Ue也嘗試返回 -1 而不是 1(使 B 到第二個位置) 測試鏈接 2: https://www.tehplayground.com/ea51PWdFfkAupEsd
查看完整描述

4 回答

?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

如果您只想將所有 s 移到末尾,則實際上不需要與 進行比較,甚至不需要返回零或 -1。比較表達式真正需要的唯一邏輯是“如果$a應該排在最后,請將其向下移動。shouldgolast$a$b

usort($array, fn($a) => $a['shouldgolast'] === 'Y');


查看完整回答
反對 回復 2022-09-17
?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

usort 函數作為第二個參數接收一個應用作比較器的可調用參數。比較器通常以這種方式工作:

  • 返回 1 ->第一個元素大于第二個元素

  • 返回 -1 ->第 2 個元素大于第一個元素

  • 返回 0 ->兩個元素相同

您必須以這種方式校正比較器功能

function sortF($a, $b)

{

    if($a['shouldgolast'] == "Y"){

        return 1;

    }else if($b['shouldgolast'] == "Y"){

        return -1;

    }

    return 0;

}


查看完整回答
反對 回復 2022-09-17
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

問題是你有返回的語句,我認為邏輯不適合這種情況,它應該根據可以應用于你的情況的條件返回適當的值,你的代碼應該看起來像這樣:else if1


<?php

$array = json_decode('[

    {

        "shouldgolast": "222",

        "name": "A",

        "shouldgolast": "N"

    },

    {

        "id": "261",

        "name": "B",

        "shouldgolast": "Y"

    },

    {

        "id": "262",

        "name": "C",

        "shouldgolast": "N"

    }

]', true);


usort($array, "sortF");


foreach ($array as $details) {

    echo $details["name"]."\n";

}


function sortF($a, $b)

{

    if($a['shouldgolast'] == "Y"){

        return 1;

    }


    if($b['shouldgolast'] == "Y"){

        return -1;

    }


    return 0;

}

?>


查看完整回答
反對 回復 2022-09-17
?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

您無需對值進行排序。


方法#1:


您只需使用指針即可將所有數組移動到右側。這類似于荷蘭國旗算法,我們將項目分組在一起。shouldgolastY


片段:


$yes_ptr = count($array) - 1;


for($i = count($array) - 1; $i >= 0; -- $i){

    if($array[$i]['shouldgolast'] == 'Y'){

        $temp = $array[$yes_ptr];

        $array[$yes_ptr--] = $array[$i];

        $array[$i] = $temp;

    }

}

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


在上面的方法中,我們只保留一個指針,該指針指示當前位置,其中應插入任何新的即將到來。請注意,這將首先成功對所有內容進行分組,稍后再對所有內容進行分組。但是,這可能會更改具有值 的元素的內部順序。yes_ptrYNYN


方法#2:


如果你想要一個穩定的分組,意味著保持所有元素和元素的順序,你可以簡單地將它們收集在2個不同的數組中,并做一個array_merge。NY


片段:


$no_array = [];

$yes_array = [];


foreach($array as $value){

    if($value['shouldgolast'] == 'N'){

        $no_array[] = $value;

    }else{

        $yes_array[] = $value;

    }

}


print_r(array_merge($no_array,$yes_array));

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


查看完整回答
反對 回復 2022-09-17
  • 4 回答
  • 0 關注
  • 150 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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