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

То есть если я смотрю только на первые цифры. Как ты численно отсортировать массив с такими строками? А именно, целые числа с добавлением «--».


Важно отметить, что эти «строки» на самом деле являются путями, которые нельзя переименовать. Увидеть шарик для дополнительной информации.

0

Решение

Редактировать после модифицированного вопроса:

После вашего редактирования, очевидно, все ответы в этой теме неверны. Кроме того, вам нужно не только скопировать и вставить часть кода, но и прочитать весь ответ. Конечно же, в своем первоначальном ответе я говорю:

если у вас есть значение вроде «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 На самом деле, исходные значения массива не изменены.

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.

Я не особо беспокоился об именах переменных, но это хороший способ сделать это.

0

natsort


Увидеть Вот.


Я не уверен как glob сортирует вещи по мере их поступления, но я думал, что sort заказал бы их правильно, но natsort сделает свое дело.

0
По вопросам рекламы [email protected]