В PHP ниже пример массива:
$version = [
"x3x3x2",
"x10x11x0",
"x180x7x1",
"x10x1x7",
"x2x0x4",
"x3x3x1",
]
Каждая запись следует этому шаблону «xNxNxN» (символ «x» и число N, три раза)
Я хочу отсортировать каждую запись этого массива по номерам слева направо. Результат, как и ожидалось:
$version = [
"x2x0x4",
"x3x3x1",
"x3x3x2",
"x10x1x0",
"x10x11x7",
"x180x7x1",
]
Как я могу это сделать ?
Пробовали ли вы какие-либо стандартные функции сортировки PHP и обнаруживали, что они делают не то, что вам нужно?
Есть встроенная функция для сравнения номеров версий. Просто объедините это с usort
.
usort($version, 'version_compare');
Результат:
var_dump($version);
array(6) {
[0]=>
string(6) "x2x0x4"
[1]=>
string(6) "x3x3x1"
[2]=>
string(6) "x3x3x2"
[3]=>
string(7) "x10x1x7"
[4]=>
string(8) "x10x11x0"
[5]=>
string(8) "x180x7x1"
}
Простое решение, сохраняя только числа и сортируя их с помощью usort
usort($version,function($a,$b){
$astr = preg_replace("/[^0-9\.]/", '', $a);
$bstr = preg_replace("/[^0-9\.]/", '', $b);
return $astr - $bstr;
});
print_r($version);
усортировать — Сортировка массива по значениям с помощью определяемой пользователем функции сравнения.
Демо.
Это отсортирует x1x10x10
после x2x1x1
. Я предполагаю, что это нежелательно, поскольку подразумевается, что строки являются номерами версий.
@MattRaines Я тестировал, вы можете проверить здесь. Он работает нормально.
зачем тебе эти данные? Потому что это выглядит очень искусственно, поэтому, если это просто домашнее задание, ответ есть, и этот ответ не является правильным ответом для «настоящего» кода.