จัดเรียงอาร์เรย์และเก็บค่าของคีย์

ฉันมีอาร์เรย์ที่มีลักษณะดังนี้:

Array
(
    [team1] => Array
        (
            [points] => 10
            [players] => Array
                (
                     ...
                )
        )

    [team2] => Array
        (
            [points] => 23
            [players] => Array
                (
                     ...
                )
        )

    ... many more teams
)

และผมขอเรียงลำดับทีมตามจำนวนคะแนนที่แต่ละทีมมี ฉันได้ลองสิ่งนี้แล้ว:

function sort_by_points($a,$b)
{
    if ($a['points']==$b['points']) return 0;
        return ($a['points']<$b['points'])?1:-1;
}

usort($this->wordswithdata, "sortbycount");

แต่วิธีการนั้นจะแทนที่คีย์ที่มีชื่อทีมและผลตอบแทน:

Array
(
    [0] => Array
        (
            [points] => 23
            [players] => Array
                (
                     ...
                )
        )

    [1] => Array
        (
            [points] => 10
            [players] => Array
                (
                     ...
                )
        )

    etc...
)

มีวิธีใดในการจัดเรียงอาร์เรย์โดยไม่เขียนทับชื่อทีมเป็นคีย์อาร์เรย์หรือไม่?


person acrmuui    schedule 02.04.2013    source แหล่งที่มา


คำตอบ (5)


ใช้ฟังก์ชัน uasort ที่ควรรักษาการเชื่อมโยงค่าของคีย์ => ให้คงเดิม

(หมายเหตุด้านข้าง: คุณสามารถทำ return $a['points'] - $b['points'] แทน ifs ได้)

person complex857    schedule 02.04.2013

คุณสามารถใช้ uasort:

uasort($array, function($a, $b) {
    return $a['points'] - $b['points'];
});

ฟังก์ชันนี้จะเรียงลำดับอาร์เรย์โดยที่ดัชนีอาร์เรย์ รักษาความสัมพันธ์ กับองค์ประกอบอาร์เรย์ที่เกี่ยวข้อง โดยใช้ฟังก์ชันการเปรียบเทียบที่ผู้ใช้กำหนด

person Shoe    schedule 02.04.2013

คุณสามารถเรียงลำดับอาเรย์แบบเชื่อมโยงตามค่าของมันได้เช่นนี้

$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");

function Ascending($a, $b) {   
    if ($a == $b) {        
        return 0;
    }   
        return ($a < $b) ? -1 : 1; 
}  

function Descending($a, $b) {   
    if ($a == $b) {        
        return 0;
    }   
        return ($a > $b) ? -1 : 1; 
}  


echo "Ascending order" ;
uasort($age,"Ascending");
print_r($age);


echo "</br>Descending order" ;
uasort($age,"Descending");
print_r($age);
person Aylian Craspa    schedule 22.07.2018

ลองใช้รหัสนี้หวังว่าจะได้ผล

function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

aasort($your_array,"points");
person Praveen kalal    schedule 02.04.2013

person    schedule
comment
ขอขอบคุณสำหรับข้อมูลโค้ดนี้ ซึ่งอาจให้ความช่วยเหลือได้ในทันทีอย่างจำกัด คำอธิบายที่เหมาะสมจะปรับปรุงคุณค่าในระยะยาวได้อย่างมากด้วยการแสดงให้เห็นว่าเหตุใดนี่เป็นวิธีแก้ปัญหาที่ดีและจะ ทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคตหากมีคำถามอื่นที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบาย รวมถึงสมมติฐานที่คุณตั้งไว้ - person Capricorn; 30.07.2018