是否有任何算法通过PHP将字符串如1.0.0
转换为可排序的数字?转换并重新转换版本号码存储在数据库中
它应该能够再次转换为相同的字符串。这是不可能的,只是删除点。另外版本的长度未知,例如1.0.0
,11.222.0
,0.8.1526
是否有任何算法通过PHP将字符串如1.0.0
转换为可排序的数字?转换并重新转换版本号码存储在数据库中
它应该能够再次转换为相同的字符串。这是不可能的,只是删除点。另外版本的长度未知,例如1.0.0
,11.222.0
,0.8.1526
如果你坚持任意长度,就没有办法唯一地映射数字,同时保持排序标准。也许你只是想在没有转换的情况下对版本号进行排序(请参阅其他答案)?
如果要比较版本号,则可以使用version_compare()
函数。
如果您有需要排序版本的数组,你可以使用函数,如usort()
/uasort()
,基于version_compare()
回调。
如果您只想对版本进行排序,则无需转换。
<?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"
}
一种选择是使用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,如果它的工作原理,因为你需要这可能是一个更好的选择。
您应该使用'min'而不是'max'。另外,当版本号相等时,你的算法返回'1'。 – Gumbo 2011-04-03 11:17:53
@Gumbo,当然,你说的对,我的错! – Czechnology 2011-04-03 11:18:34
版本存储在数据库中,问题是MySQL不会正确排序字符串数字,我认为将它们存储为数字可能是个好主意。 – Omid 2011-04-03 11:23:20
这里有几个函数将版本转换为字符串,反之亦然。
因此,您可以将字符串存储在数据库中并能够对它们进行排序。我使用了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
)
固定长度如何? – Omid 2011-04-03 11:28:22
然后它将成为可能。如果您的版本由A.B.C三部分组成,其中每部分长度最多为N(十进制数字),则可以使用A * 10 ^(2 * N)+ B * 10^N + C作为唯一版本号。 – Howard 2011-04-03 11:30:34
你能给我一个亲爱的霍华德样品吗?我不明白'^'字符 – Omid 2011-04-03 11:37:05