是否有任何算法可以通过PHP将1.0.0
之类的字符串转换为可排序的数字?
它应该能够再次转换为相同的字符串。不可能只删除点。版本长度也未知,例如1.0.0
,11.222.0
,0.8.1526
答案 0 :(得分: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"
}
答案 1 :(得分:1)
如果您想比较版本号,可以使用version_compare()
函数。
如果您有需要排序的版本数组,则可以使用usort()
/ uasort()
等函数,并基于version_compare()
进行回调。
答案 2 :(得分:1)
如果您坚持任意长度,则无法在保持排序标准的同时唯一地映射数字。也许你只是想在没有转换的情况下对版本号进行排序(参见其他答案)?
答案 3 :(得分:1)
如果您希望使用12345
等数字进行版本分段(例如0.9.12345.2
),那么您可能最好将字符串展开并将每个段存储在SQL中的单独字段中。
通过这种方式,您可以按照自己的意愿对其进行排序。
答案 4 :(得分: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,如果它可以根据您的需要运作,那么这可能是更好的选择。
答案 5 :(得分: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
)