2011-04-03 38 views

回答

1

如果你坚持任意长度,就没有办法唯一地映射数字,同时保持排序标准。也许你只是想在没有转换的情况下对版本号进行排序(请参阅其他答案)?

+0

固定长度如何? – Omid 2011-04-03 11:28:22

+1

然后它将成为可能。如果您的版本由A.B.C三部分组成,其中每部分长度最多为N(十进制数字),则可以使用A * 10 ^(2 * N)+ B * 10^N + C作为唯一版本号。 – Howard 2011-04-03 11:30:34

+0

你能给我一个亲爱的霍华德样品吗?我不明白'^'字符 – Omid 2011-04-03 11:37:05

1

如果要比较版本号,则可以使用version_compare()函数。


如果您有需要排序版本的数组,你可以使用函数,如usort()/uasort(),基于version_compare()回调。

4

如果您只想对版本进行排序,则无需转换。

<?php 
$versions = array('1.0.0', '11.222.0', '0.8.1256'); 
usort($versions, 'version_compare'); 

var_dump($versions); 
array(3) { 
    [0]=> 
    string(8) "0.8.1256" 
    [1]=> 
    string(5) "1.0.0" 
    [2]=> 
    string(8) "11.222.0" 
} 
+0

版本存储在数据库中,问题是MySQL不会串号正确排序,我认为这可能是一个好主意,将它们存储为数字。 – Omid 2011-04-03 11:21:23

+0

在这种情况下,除非您确定每个点之间的数字位数(例如,不超过4位数字),否则恐怕没有简单的解决方案。您仍然可以获取行并对它们进行排序,但如果您想要仅选择10个最新版本,则不会进行优化。 – Artefact2 2011-04-03 11:31:11

0

一种选择是使用explode

function cmp($a, $b) 
{ 
    $a = explode('.', $a); 
    $b = explode('.', $b); 

    $m = min(count($a), count($b)); 

    for ($i = 0; $i < $m; $i++) { 
     if (intval($a[$i]) < intval($b[$i])) 
     return -1; 
     else 
     return 1; 
    } 

    return 0; 
} 

编辑:不知道version_compare,如果它的工作原理,因为你需要这可能是一个更好的选择。

+0

您应该使用'min'而不是'max'。另外,当版本号相等时,你的算法返回'1'。 – Gumbo 2011-04-03 11:17:53

+0

@Gumbo,当然,你说的对,我的错! – Czechnology 2011-04-03 11:18:34

+0

版本存储在数据库中,问题是MySQL不会正确排序字符串数字,我认为将它们存储为数字可能是个好主意。 – Omid 2011-04-03 11:23:20

1

如果您希望使用12345(例如0.9.12345.2)之类的数字进行版本分割,那么您最好将爆炸字符串并将每个段存储在SQL中的单独字段中。

这样你就可以对它进行分类,如何你想要的。

+0

所以它在'WHERE version>'这样的条件下无用2.4.1'' – Omid 2011-04-03 11:33:39

+2

@Omid你可以将这个条件转换为WHERE(版本> 2)或(版本== 2和subversion> 4)或(version == 2和subversion == 4和revision> = 1)。 – Howard 2011-04-03 11:45:26

0

这里有几个函数将版本转换为字符串,反之亦然。

因此,您可以将字符串存储在数据库中并能够对它们进行排序。我使用了5个字符的长度,但可以适应您的需求。

function version_to_str($version) { 
    $list = explode('.', $version); 
    $str = ''; 
    foreach ($list as $element) { 
     $str .= sprintf('%05d', $element); 
    } 
    return $str; 
} 
function str_to_version($str) { 
    $version = array(); 
    for ($i=0; $i<strlen($str); $i+=5) { 
     $version[] = intval(substr($str, $i, 5)); 
    } 
    return implode('.', $version); 
} 

$versions = array('1.0.0', '11.222.0', '0.8.1526'); 

$versions = array_map("version_to_str", $versions); 
sort($versions); 
$versions = array_map("str_to_version", $versions); 
print_r($versions); 

输出:

Array 
(
    [0] => 0.8.1526 
    [1] => 1.0.0 
    [2] => 11.222.0 
)