首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何自然地对多维数组进行排序?

如何自然地对多维数组进行排序?
EN

Stack Overflow用户
提问于 2019-04-23 12:31:55
回答 2查看 179关注 0票数 1

我有这样一个数组:

代码语言:javascript
复制
[
    ['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'],
]

我想要这样的产出:

代码语言:javascript
复制
[
    ['number' => '102-1'],
    ['number' => '102-2'],
    ['number' => '102-11'],
    ['number' => '105-1'],
    ['number' => '203-1'],
    ['number' => '302-1'],
    ['number' => '302-2'],
    ['number' => '419-1'],
    ['number' => '508-1']
]

问题是数字存储为字符串。我想把数字看作整数。排序需要在数字上完成。不是字符串比较,,我试过用usort,但这没有帮助。

有人能帮帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-23 12:44:33

您希望自然地对数组值进行排序,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+

代码语言:javascript
复制
array_multisort(array_column($ar, 'number'), SORT_ASC, SORT_NATURAL, $ar);
var_export($ar);

或者,您可以将strnatcmpusort结合使用。

PHP 5.3+

代码语言:javascript
复制
usort($ar, function($a, $b) {
   return strnatcmp($a['number'], $b['number']);
});
var_export($ar);

结果

代码语言:javascript
复制
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',
  ),
)
票数 3
EN

Stack Overflow用户

发布于 2019-04-23 12:35:46

代码语言:javascript
复制
$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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55811303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档