Как численно отсортировать массив следующим образом: ['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
)

eval.in demo

Объяснение картины:

~
 ^          # 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 сделает свое дело.

Другие вопросы по тегам