在 PHP 中对文件名进行排序,如 abc 1.1、abc 1.1.1、abc 1.0


Sort filename like abc 1.1, abc 1.1.1, abc 1.0 in PHP

我用过natsort(),但它没有像我想要的那样工作。

它显示排序数组,如下所示:

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
)
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

<?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);
?>

如果需要,您可以考虑更好的比较算法