簡體   English   中英

自定義排序(usort)/按兩個值排序數組后按多維索引數組中的數組值字母順序排序

[英]Sorting alphabetically by Array Value in Multidimensional Indexed Array After Custom Sort (usort) / Sort Array by Two Values

原始數組:

[0] => Array
    (
        [name] => Light Amethyst
        [description] => color
    )

[1] => Array
    (
        [name] => Stone
        [description] => base material
    )

[2] => Array
    (
        [name] => Emerald
        [description] => color
    )

[3] => Array
    (
        [name] => Brass
        [description] => base material
    )

應用usort($terms, "mysort"); 通過以下功能

function getSortOrder($c) {
    $sortOrder = array(
        "base material",
        "color"
    );
    $pos = array_search($c['description'], $sortOrder);
    return $pos !== false ? $pos : 99999;
}

function mysort($a, $b) {
    if( getSortOrder($a) < getSortOrder($b) ) {
        return -1;
    }elseif( getSortOrder($a) == getSortOrder($b) ) {
        return 0;
    }else {
        return 1;
    }
}

這樣就成功通過getSortOrder function 中的$sortOrder數組對數組進行排序(先有底材,后有顏色)

[0] => Array
    (
        [name] => Stone
        [description] => base material
    )

[1] => Array
    (
        [name] => Brass
        [description] => base material
    )

[2] => Array
    (
        [name] => Light Amethyst
        [description] => color
    )

[3] => Array
    (
        [name] => Emerald
        [description] => color
    )

現在我正在嘗試按name對這個新的排序數組進行排序,同時保持先前應用的排序順序(首先是基礎材料,然后是顏色)。

預期 Output:

[0] => Array
    (
        [name] => Brass
        [description] => base material
    )

[1] => Array
    (
        [name] => Stone
        [description] => base material
    )

[2] => Array
    (
        [name] => Emerald
        [description] => color
    )

[3] => Array
    (
        [name] => Light Amethyst
        [description] => color
    )

通常我可以像這樣應用一個usort function :

usort($people,"sort_name");
function sort_name($a,$b)
{
  return $a["name"] > $b["name"];
}

但這當然會弄亂原始description排序的 output。

我怎樣才能像上面的函數一樣先按description排序,然后在保持description排序的同時繼續按name排序?

您可以使用array_multisort將一個 go 中的原始數據排序為預期的 output (先按描述排序,然后按名稱排序),如下所示

$data = [
    ['name' => 'Light Amethyst', 'description' => 'color'],
    ['name' => 'Stone', 'description' => 'base material'],
    ['name' => 'Emerald', 'description' => 'color'],
    ['name' => 'Brass', 'description' => 'base material']
];


array_multisort(array_column($data, 'description'), SORT_ASC, array_column($data, 'name'), SORT_ASC, $data);

$data現在將首先按description排序,然后按name排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM