字符优先级的顺序是这样的吗:
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
~
在未来,看看如何创建一个最小、完整和可验证的示例
原始答案(针对原始问题):
肯定有很多方法可以获得你的结果。使用usort
和preg_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
会起作用。