array_multisort和自然排序

时间:2012-07-03 16:07:33

标签: php mysql

很高兴认识你的家人。

我有这个多维数组:

$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);

我想在自然排序中按名称列排序数组,但对我来说是难以理解的。

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

我希望得到你的帮助 此致

2 个答案:

答案 0 :(得分:7)

您可以使用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)
  }
}

now it looks like

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\']);' ));

答案 1 :(得分:2)

如果您使用的是PHP 5.4或更高版本,则可以将array_multisortSORT_NATURAL标志一起使用。只需按照http://php.net/manual/en/function.array-multisort.php文档中的示例#3操作,但添加SORT_NATURAL选项。