我已经使用natsort(),但它没有工作,因为我想拥有。排序文件名喜欢abc 1.1,abc 1.1.1,abc 1.0在PHP
它显示排序后的数组是这样的:
1)ABC 1.0
2)ABC 1.1.1
3)ABC 1.1
但我想:
1 )abc 1.0
2)abc 1.1
3)ABC 1.1.1
那么,请告诉这个又是什么在PHP
我已经使用natsort(),但它没有工作,因为我想拥有。排序文件名喜欢abc 1.1,abc 1.1.1,abc 1.0在PHP
它显示排序后的数组是这样的:
1)ABC 1.0
2)ABC 1.1.1
3)ABC 1.1
但我想:
1 )abc 1.0
2)abc 1.1
3)ABC 1.1.1
那么,请告诉这个又是什么在PHP
如何关于:
$array = array('abc 1.0','abc 1.1.1','abc 1.1','xyz 1.1','def 2.0');
function fct($a, $b) {
list($al, $an) = explode(' ', $a);
list($bl, $bn) = explode(' ', $b);
if ($al == $bl) return version_compare($an, $bn);
return strcmp($al, $bl);
}
usort($array, 'fct');
print_r($array);
输出:
Array
(
[0] => abc 1.0
[1] => abc 1.1
[2] => abc 1.1.1
[3] => def 2.0
[4] => xyz 1.1
)
的可能的解决方案定义自己的比较功能,并使用usort
<?php
function cmp($a, $b) {
$a = preg_replace("/[^0-9,.]/", "", $a);
$b = preg_replace("/[^0-9,.]/", "", $b);
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$arr = array('abc 1.1', 'abc 1.0', 'abc 1.1.1');
usort($arr, "cmp");
print_r($arr);
?>
你可以想想更好比较算法如果需要
更好的比较算法可能需要分割文件名和版本,然后使用[version_compare()](http://php.net/manual/en/function.version-compare.php) –
function csort($a, $b) {
$a = preg_split("/\s+/", $a);
$b = preg_split("/\s+/", $b);
return version_compare($a[1], $b[1]);
}
$r = array('abc 1.1', 'abc 1.0', 'abc 1.1.1');
usort($r, "csort");
或简单地
usort($r, "version_compare");
提议@onetrickpony
。
'usort($ r,“ version_compare“);'应该工作得很好,不需要别的东西 –
@onetrickpony tnx评论 –
放置'def 1.0'在哪里? – Toto