如何自然排序多维数组?

时间:2019-04-23 12:31:55

标签: php arrays sorting

我有一个像这样的数组:

const intrface : < what's the type> = ui.dates.IDateFormat; // will this work

我想要这样的输出:

[
    ['number' => '419-1'],
    ['number' => '302-1'],
    ['number' => '102-1'],
    ['number' => '102-11'],
    ['number' => '203-1'],
    ['number' => '508-1'],
    ['number' => '105-1'],
    ['number' => '102-2'],
    ['number' => '302-2'],
]

问题是数字存储为字符串。 我想将数字视为整数。排序需要按数字进行。不是字符串比较。我尝试了usort,但这没有帮助。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

$arr =    [
        ['number' => '419-1'],
        ['number' => '419-11'],
        ['number' => '102-1'],
        ['number' => '203-1'],
        ['number' => '508-1'],
        ['number' => '105-1'],
        ['number' => '102-2'],
        ['number' => '302-2'],
    ];

    usort($arr, function($a,$b){

        $an = explode('-',$a['number']);
        $bn = explode('-',$b['number']);

        if($an[0] == $bn[0]){
            return $an[1]*1 > $bn[1]*1;
        }

        return $an[0]*1 > $bn[0]*1;

    });

    print_r($arr);

答案 1 :(得分:3)

您想自然地对数组值1, 2, 10, 20进行排序,以使它们不作为数字字符串1, 10, 2, 20进行排序。其结果在PHP 5和PHP 7中应该相同。

您可以将array_multisortSORT_ASCSORT_NATURAL标志一起使用,并与array_column一起使用以检索要排序的值。

示例https://3v4l.org/BNCe5

PHP 5.5 +

array_multisort(array_column($ar, 'number'), SORT_ASC, SORT_NATURAL, $ar);
var_export($ar);

您也可以将strnatcmpusort一起使用。

PHP 5.3 +

usort($ar, function($a, $b) {
   return strnatcmp($a['number'], $b['number']);
});
var_export($ar);

结果

array (
  0 => 
  array (
    'number' => '102-1',
  ),
  1 => 
  array (
    'number' => '102-2',
  ),
  2 => 
  array (
    'number' => '102-11',
  ),
  3 => 
  array (
    'number' => '105-1',
  ),
  4 => 
  array (
    'number' => '203-1',
  ),
  5 => 
  array (
    'number' => '302-1',
  ),
  6 => 
  array (
    'number' => '302-2',
  ),
  7 => 
  array (
    'number' => '419-1',
  ),
  8 => 
  array (
    'number' => '508-1',
  ),
)