如何对数组进行数字排序,如下图所示:[';11-2017 name.png';,';1-2016 na


How to numerically sort an array like this: ['11--2017 name.png','1--2016 name.png','2--1999 name.png']

字符优先级的顺序是这样的吗:

1--2016 name.png, 11--2017 name.png, 2--1999 name.png

然而,从数字上看,它们是这样的:

1--2016 name.png, 2--1999 name.png, 11--2017 name.png

也就是说,如果我只看第一个数字。如何用这样的字符串对数组进行数字排序?即,加上"--"的整数。


需要注意的是,这些"字符串"实际上是不能重命名的路径名。有关详细信息,请参阅glob。

编辑,修改问题后:

经过编辑,显然这个帖子中的所有答案都是错误的。此外,您不必只复制和粘贴一段代码,而是要阅读整个答案。果不其然,在我最初的回答中,我说:

如果你有一个像"12-3"这样的值,它将像"123"一样排序

所以,您可以立即看到您的真实案例与所提供的样本不一致。

第二个解决方案将按给定basename路径开头的数字对数组进行排序,后跟两个短划线适用于以下情况:

String                          Will be sorted by
------------------------------  -----------------
/Absolute/Path/12--             12
/Absolute/Path/12--2001.png     12
/12--2001.png                   12
12--2001.png                    12
a12--2001.png                   a12--2001.png
-12--2001.png                   -12--2001.png

拥有此阵列:

[
    '/path/to/image/1--2016 name.png', 
    '/path/to/image/11--2017.png', 
    '/path/to/image/2--1999.png' 
]

您可以将上述原始解决方案的正则表达式模式替换为以下模式:

~^(.*/)?('d+)--[^/]*$~

上面的数组将以这种方式排序:

Array
(
    [0] => /path/to/image/1--2016 name.png
    [1] => /path/to/image/2--1999.png
    [2] => /path/to/image/11--2017.png
)

eval.in演示

图案说明:

~
 ^          # Start of string
 (.*/)?     # Group 1 (optional): zero-ore-more characters followed by a slash
 ('d+)      # Group 2: one-or-more digits
 --         # two dashes
 [^/]*      # zero-or-more characters, except slash
 $          # End of string
~

在未来,看看如何创建一个最小、完整和可验证的示例


原始答案(针对原始问题):

肯定有很多方法可以获得你的结果。使用usortpreg_replace:

$array = ['11--','23--','1--'];
usort
(
    $array,
    function( $a, $b )
    {
        return preg_replace( '~[^'d]~', '', $a ) - preg_replace( '~[^'d]~', '', $b );
    }
);

$array现在是:

Array
(
    [0] => 1--
    [1] => 11--
    [2] => 23--
)

以上解决方案将对您的数组进行排序,删除1所有非数字字符
因此,如果您有一个像12--3这样的值,它将像123一样排序。因此,它不适用于非整数或负数。


1实际上,原始数组值没有改变。

如果你想快速解决这个问题,你可以:

$strings = array('5--', '2--', '11--');
$newStrings = array();
foreach ($strings as $string) {
  $stringNew = str_replace('--', '', $string);
  array_push($newStrings, $stringNew);
}
sort($newStrings);
$doneArray = array();
foreach ($newStrings as $newString) {
  array_push($doneArray, $newString.'--');
}
// $doneArray is the new array full of the sorted strings.

我并没有真正关心变量名,但这是一个很好的方法。

natsort


请参见此处。


我不确定glob是如何排序的,但我认为sort会正确排序,但natsort会起作用。