Как численно отсортировать массив следующим образом: ['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 для получения дополнительной информации.
3 ответа
Редактировать после модифицированного вопроса:
После вашего редактирования, очевидно, все ответы в этой теме неверны. Кроме того, вам нужно не только скопировать и вставить часть кода, но и прочитать весь ответ. Конечно же, в своем первоначальном ответе я говорю:
если у вас есть значение вроде "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
сделает свое дело.