根据一列中的值对行数组进行自然排序


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 或更高版本,则可以将 array_multisortSORT_NATURAL 标志一起使用。只需按照 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);