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

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

使用PHP的uasort排序時保留鍵順序(穩定排序)

使用PHP的uasort排序時保留鍵順序(穩定排序)

倚天杖 2019-11-04 09:49:42
這個問題實際上是從SO上的另一個問題得到啟發的,我想對其進行擴展。在PHP中有一個關聯數組可以對它的值進行排序,但是使用一個(或多個)PHP內置的排序函數,這些值等于保留原始鍵順序的值嗎?這是我用來測試可能的解決方案的腳本(尚未找到):<?phpheader('Content-type: text/plain');for($i=0;$i<10;$i++){    $arr['key-'.$i] = rand(1,5)*10;}uasort($arr, function($a, $b){    // sort condition may go here //    // Tried: return ($a == $b)?1:($a - $b); //    // Tried: return $a >= $b; //});print_r($arr);?>陷阱:由于鍵是按原始數組排序的,因此請不要試圖建議按鍵進行任何排序以恢復到原始順序。我將它們排序為示例,以便更直觀地查看輸出中的順序。
查看完整描述

3 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

array_multisort派上用場,只需將有序范圍用作第二個數組($order只是臨時的,它用于按其原始順序對第一個數組的等效項進行排序):

$a = [

  "key-0" => 5,

  "key-99" => 3,

  "key-2" => 3,

  "key-3" => 7

];


$order = range(1,count($a));

array_multisort($a, SORT_ASC, $order, SORT_ASC);


var_dump($a);

輸出量


array(4) {

  ["key-99"]=>

  int(3)

  ["key-2"]=>

  int(3)

  ["key-0"]=>

  int(5)

  ["key-3"]=>

  int(7)

}

我使用帶有未排序鍵的測試數據來證明它可以正常工作。盡管如此,這是測試腳本的輸出:


Array

(

    [key-1] => 10

    [key-4] => 10

    [key-5] => 20

    [key-8] => 20

    [key-6] => 30

    [key-9] => 30

    [key-2] => 40

    [key-0] => 50

    [key-3] => 50

    [key-7] => 50

)

缺點

它僅適用于預定義的比較,不能使用自己的比較功能??赡艿闹担ǖ牡诙€參數array_multisort())為:


排序類型標志:


SORT_ASC -升序排序。

SORT_DESC -遞減排序。

SORT_REGULAR -通常比較商品(不要更改類型)

SORT_NUMERIC -數字比較項目

SORT_STRING -比較項目作為字符串

SORT_LOCALE_STRING-根據當前語言環境將項目作為字符串進行比較。它使用語言環境,可以使用 setlocale()

SORT_NATURAL -使用“自然順序”將項目作為字符串進行比較 natsort()

SORT_FLAG_CASE-可以與SORT_STRING或組合(按位或)以SORT_NATURAL區分大小寫的字符串


查看完整回答
反對 回復 2019-11-04
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

為了完整起見,您還應該查看Schwartzian變換:


// decorate step

$key = 0;

foreach ($arr as &$item) {

        $item = array($item, $key++); // add array index as secondary sort key

}


// sort step

asort($arr); // sort it


// undecorate step

foreach ($arr as &$item) {

    $item = $item[0]; // remove decoration from previous step

}

PHP的默認排序算法正常工作與陣列,因為這樣:


array(1, 0) < array(2, 0); // true

array(1, 1) < array(1, 2); // true

如果你想使用自己的分類標準可以使用uasort(),以及:


// each parameter is an array with two elements

// [0] - the original item

// [1] - the array key

function mysort($a, $b)

{

    if ($a[0] != $b[0]) {

        return $a[0] < $b[0] ? -1 : 1;

    } else {

        // $a[0] == $b[0], sort on key

        return $a[1] < $b[1] ? -1 : 1; // ASC

    }

}


查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 959 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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