Php 将版本转换并重新转换为要存储在数据库中的编号

Php 将版本转换并重新转换为要存储在数据库中的编号,php,Php,是否有任何算法可以通过PHP将字符串(如1.0.0)转换为可排序的数字 它应该能够再次转换为相同的字符串。不可能只删除点。此外,版本的长度未知,例如1.0.0、11.222.0、0.8.1526如果要比较版本号,可以使用该功能 如果你有一个需要排序的版本数组,你可以使用一个函数,比如/,它带有一个基于版本比较的回调。如果你想比较版本号,你可以使用这个函数 如果您有一个需要排序的版本数组,您可以使用诸如/(version\u compare)之类的函数,并根据版本进行回调。如果您只想对版本进行

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


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

如果要比较版本号,可以使用该功能


如果你有一个需要排序的版本数组,你可以使用一个函数,比如/,它带有一个基于版本比较的回调。

如果你想比较版本号,你可以使用这个函数


如果您有一个需要排序的版本数组,您可以使用诸如/(version\u 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"
}

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

<?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"
}
一种选择是使用:

编辑:不知道,如果它能满足您的需要,这可能是一个更好的选项。

一个选项是使用:


编辑:不知道,如果它能满足您的需要,那么这可能是一个更好的选择。

如果您坚持使用任意长度,则无法在保持排序标准的同时唯一地映射数字。也许您只是想在不转换的情况下对版本号进行排序,请参见其他答案?

如果您坚持使用任意长度,则无法在保持排序标准的同时唯一地映射数字。也许您只是想在不转换的情况下对版本号进行排序,请参见其他答案?

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


这样,您就可以根据自己的意愿对其进行排序。

如果您希望版本分段使用数字12345,例如0.9.12345.2,那么您最好将字符串分解,并将每个分段存储在SQL中的单独字段中


这样,您可以根据自己的意愿对其进行排序。

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

因此,您可以将字符串存储在数据库中并对其进行排序。我使用了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);

这里有两个函数可以将version转换为string,反之亦然

因此,您可以将字符串存储在数据库中并对其进行排序。我使用了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);

您应该使用min而不是max。此外,当版本号相等时,您的算法返回1。版本存储在数据库中,问题是MySQL无法正确排序字符串号,我认为最好将它们存储为数字。您应该使用min而不是max。此外,当版本号相等时,您的算法返回1。版本存储在数据库中,问题是MySQL无法正确排序字符串号,我认为最好将其存储为数字。版本存储在数据库中,问题是MySQL无法正确排序字符串号,我认为将它们存储为一个数字可能是一个好主意。在这种情况下,恐怕没有简单的解决方案,除非您将每个点之间的数字固定为不超过4位。您仍然可以获取行并在之后对其进行排序,但如果您希望,例如,仅选择10个最新版本,则它没有得到优化。版本存储在数据库中,问题是MySQL无法正确排序字符串数字,我认为将其存储为数字可能是一个好主意。在这种情况下,恐怕没有简单的解决办法,除非你把每个点之间的位数固定下来,比如不超过4位数。您仍然可以获取行并在之后对它们进行排序,但如果您希望(例如)只选择10个最新版本,则它不会得到优化。这样就可以了。如果您的版本由三个部分组成,每个部分的长度最多为N(十进制数字),您可以使用*10^2*N+B*10^N+C作为唯一的版本号。亲爱的Howard,您能给我一个示例吗?我不明白你说的“^characterOK.”是什么意思意味着指数化。例如,假设您的subversion编号最多有3位数字,例如V3.109.78。然后你计算3*1000000+109*1000+78=3109078,得到一个唯一的数字,也就是说,你也可以通过在适当的位置3.109.078插入点并删除前导零(如果需要)来计算回3.109.78。谢谢你,Howard,那么如何将其转换为相同的字符串呢?那么这将是可能的。如果您的版本由三个部分组成,每个部分的长度最多为N(十进制数字),您可以使用*10^2*N+B*10^N+C作为唯一的版本号。亲爱的Howard,您能给我一个示例吗?我不明白你说的“^characterOK.”是什么意思意味着指数化。例如,假设您的subversion编号最多有3位数字,例如V3.109.7
8.然后你计算3*1000000+109*1000+78=3109078,得到一个唯一的数字,也就是说,你也可以通过在适当的位置3.109.078插入点并删除前导零(如果需要的话)3.109.78来计算,那么如何将其转换为相同的字符串呢?因此它在版本>2.4.1@Omid的情况下不有用。您可以将此条件转换为版本>2或版本==2且subversion>4或版本==2且subversion==4且修订版>=1。因此,它在版本>2.4.1@Omid的情况下不有用。您可以将此条件转换为其中,版本>2或版本==2且subversion>4或版本==2且subversion==4且版本>=1。