簡體   English   中英

根據一列中的值對行數組進行自然排序

[英]Natural sort an array of rows based on values in one column

我有這個多維數組:

$data[] = array('name' => 'Mini 16', 'id' => 105);
$data[] = array('name' => 'Mini 15', 'id' => 5650);
$data[] = array('name' => 'Mini 100', 'id' => 9889);
$data[] = array('name' => 'Mini 20', 'id' => 587);

我想自然地按name列排序對數組進行排序,但對我來說很難。

預期結果:

[
    ['name' => 'Mini 15', 'id' => 5650],
    ['name' => 'Mini 16', 'id' => 105],
    ['name' => 'Mini 20', 'id' => 587],
    ['name' => 'Mini 100', 'id' => 9889]
]

您可以使用usort()通過自定義函數對數組進行排序,並使用strnatcmp()對兩個字符串進行自然比較,如下所示:

usort( $data, function( $el1, $el2) { return strnatcmp( $el1['name'], $el2['name']); });

所以之前,你的數組是這樣的:

array(4) {
  [0]=>
  array(2) {
    ["name"]=>
    string(7) "Mini 16"
    ["id"]=>
    int(105)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(7) "Mini 15"
    ["id"]=>
    int(5650)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(8) "Mini 100"
    ["id"]=>
    int(9889)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(7) "Mini 20"
    ["id"]=>
    int(587)
  }
}

現在它看起來像

array(4) {
  [0]=>
  array(2) {
    ["name"]=>
    string(7) "Mini 15"
    ["id"]=>
    int(5650)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(7) "Mini 16"
    ["id"]=>
    int(105)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(7) "Mini 20"
    ["id"]=>
    int(587)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(8) "Mini 100"
    ["id"]=>
    int(9889)
  }
}

請注意,對於較低版本的 PHP,您將無法使用匿名函數,而是需要以下內容:

usort( $data, create_function( '$el1, $el2', 'return strnatcmp( $el1[\'name\'], $el2[\'name\']);' ));

如果您使用的是 PHP 5.4 或更新版本,您可以使用帶有SORT_NATURAL標志的array_multisort 只需遵循http://php.net/manual/en/function.array-multisort.php文檔中的示例 #3,但添加SORT_NATURAL選項。

正如 Craig 回答的一半, array_multisort()將比usort()更高效,因為array_multisort()不會進行迭代函數調用。

代碼:(演示

array_multisort(array_column($data, 'name'), SORT_NATURAL, $data);
var_export($data);

這是 nickb 答案的現代箭頭函數語法。

代碼(PHP7.4 及更高版本):(演示

usort($data, fn($a, $b) => strnatcmp($a['name'], $b['name']));
var_export($data);

暫無
暫無

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

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