Правильно ли я, что приоритет символов будет выглядеть так:
1--2016 name.png, 11--2017 name.png, 2--1999 name.png
Численно, однако, они были бы такими:
1--2016 name.png, 2--1999 name.png, 11--2017 name.png
То есть если я смотрю только на первые цифры. Как ты численно отсортировать массив с такими строками? А именно, целые числа с добавлением «--
».
Важно отметить, что эти «строки» на самом деле являются путями, которые нельзя переименовать. Увидеть шарик для дополнительной информации.
После вашего редактирования, очевидно, все ответы в этой теме неверны. Кроме того, вам нужно не только скопировать и вставить часть кода, но и прочитать весь ответ. Конечно же, в своем первоначальном ответе я говорю:
если у вас есть значение вроде «12—3», оно будет отсортировано как «123»
Таким образом, вы можете сразу увидеть, что ваш реальный случай не соответствует предоставленной выборке.
Это второе решение будет сортировать массив по номер в начале заданного пути базового имени, за которым следуют две черты. Это будет применяться в следующих случаях:
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
)
Объяснение картины:
~
^ # 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
сделает свое дело.