将版本转换并重新转换为数字以存储在数据库中

时间:2011-04-03 11:11:31

标签: php

是否有任何算法可以通过PHP将1.0.0之类的字符串转换为可排序的数字?

它应该能够再次转换为相同的字符串。不可能只删除点。版本长度也未知,例如1.0.011.222.00.8.1526

6 个答案:

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