-1 (smaller) version_compare("2.5.2", "2.5.2") => 0 (equal) version_compare("2.5.5", "2.5.2") => 1 (bigger) version_compare("2.5.11", "2.5.2") =>"> -1 (smaller) version_compare("2.5.2", "2.5.2") => 0 (equal) version_compare("2.5.5", "2.5.2") => 1 (bigger) version_compare("2.5.11", "2.5.2") =>"> -1 (smaller) version_compare("2.5.2", "2.5.2") => 0 (equal) version_compare("2.5.5", "2.5.2") => 1 (bigger) version_compare("2.5.11", "2.5.2") =>" />

Сравнение двух строк версии в PHP

Как сравнить две строки в формате версии? так что:

version_compare("2.5.1",  "2.5.2") => -1 (smaller)
version_compare("2.5.2",  "2.5.2") =>  0 (equal)
version_compare("2.5.5",  "2.5.2") =>  1 (bigger)
version_compare("2.5.11", "2.5.2") =>  1 (bigger, eleven is bigger than two)
8
Да, это также иронично, что я произвел нисходящие голоса, когда я на один шаг приближаюсь к 10K ;-)
добавлено автор ohho, источник
Да, это также иронично, что я произвел нисходящие голоса, когда я на один шаг приближаюсь к 10K ;-)
добавлено автор ohho, источник
@hakre, извините, что я не понимал, что в PHP есть функция version_compare , а также работает strnatcmp .
добавлено автор ohho, источник
@hakre, извините, что я не понимал, что в PHP есть функция version_compare , а также работает strnatcmp .
добавлено автор ohho, источник
@hakre, извините, что я не понимал, что в PHP есть функция version_compare , а также работает strnatcmp .
добавлено автор ohho, источник
@hakre, моя вина. Я googled вокруг strcmp , но ... Это моя вина.
добавлено автор ohho, источник
@hakre, моя вина. Я googled вокруг strcmp , но ... Это моя вина.
добавлено автор ohho, источник
Я должен сказать, что этот день сделал мой день.
добавлено автор Chris Rae, источник
Я должен сказать, что этот день сделал мой день.
добавлено автор Chris Rae, источник
Я должен сказать, что этот день сделал мой день.
добавлено автор Chris Rae, источник
@ohho: Но похоже, что вы скоро это сделаете;)
добавлено автор hakre, источник
@ohho: Но похоже, что вы скоро это сделаете;)
добавлено автор hakre, источник
@ohho: Но похоже, что вы скоро это сделаете;)
добавлено автор hakre, источник
Вероятно, «естественный порядок» , вы пробовали php.net/strnatcmp ?
добавлено автор hakre, источник
Да, иногда они не видят леса для деревьев. Как-то иронично, что вы выбрали правильную функцию в своем вопросе, не видя этого;)
добавлено автор hakre, источник
Да, иногда они не видят леса для деревьев. Как-то иронично, что вы выбрали правильную функцию в своем вопросе, не видя этого;)
добавлено автор hakre, источник
Да, иногда они не видят леса для деревьев. Как-то иронично, что вы выбрали правильную функцию в своем вопросе, не видя этого;)
добавлено автор hakre, источник
@ohho: Да, это точно проблема. Сделайте домашнее задание;) Я удаляю отрицательный голос сейчас, когда вы это видели. И посоветуйте руководство, просто добавьте его после имени домена: php.net/version_compare - вы не можете первый взгляд проще.
добавлено автор hakre, источник
@ohho: Да, это точно проблема. Сделайте домашнее задание;) Я удаляю отрицательный голос сейчас, когда вы это видели. И посоветуйте руководство, просто добавьте его после имени домена: php.net/version_compare - вы не можете первый взгляд проще.
добавлено автор hakre, источник
Проверьте свой код, прежде чем спросить. Я мог бы просто работать (как в вашем случае). -1 для этого.
добавлено автор hakre, источник
Проверьте свой код, прежде чем спросить. Я мог бы просто работать (как в вашем случае). -1 для этого.
добавлено автор hakre, источник
Что случилось с встроенным PHP version_compare ?
добавлено автор DCoder, источник
Что случилось с встроенным PHP version_compare ?
добавлено автор DCoder, источник

16 ответы

Из интерактивного приглашения PHP с помощью version_compare функция, встроенная в PHP с 4,1 :

php > print_r(version_compare("2.5.1",  "2.5.2"));//expect -1
-1
php > print_r(version_compare("2.5.2",  "2.5.2"));//expect 0
0
php > print_r(version_compare("2.5.5",  "2.5.2"));//expect 1
1
php > print_r(version_compare("2.5.11", "2.5.2"));//expect 1
1

Кажется, PHP работает, как вы ожидаете. Если вы сталкиваетесь с другим поведением, возможно, вам следует это указать.

29
добавлено
Может подтвердить. Просто работает. ВСЕ версии PHP. 3v4l.org/U0mvm#v430 То же самое для сравнения естественного порядка.
добавлено автор hakre, источник

Из интерактивного приглашения PHP с помощью version_compare функция, встроенная в PHP с 4,1 :

php > print_r(version_compare("2.5.1",  "2.5.2"));//expect -1
-1
php > print_r(version_compare("2.5.2",  "2.5.2"));//expect 0
0
php > print_r(version_compare("2.5.5",  "2.5.2"));//expect 1
1
php > print_r(version_compare("2.5.11", "2.5.2"));//expect 1
1

Кажется, PHP работает, как вы ожидаете. Если вы сталкиваетесь с другим поведением, возможно, вам следует это указать.

29
добавлено
Может подтвердить. Просто работает. ВСЕ версии PHP. 3v4l.org/U0mvm#v430 То же самое для сравнения естественного порядка.
добавлено автор hakre, источник

Из интерактивного приглашения PHP с помощью version_compare функция, встроенная в PHP с 4,1 :

php > print_r(version_compare("2.5.1",  "2.5.2"));//expect -1
-1
php > print_r(version_compare("2.5.2",  "2.5.2"));//expect 0
0
php > print_r(version_compare("2.5.5",  "2.5.2"));//expect 1
1
php > print_r(version_compare("2.5.11", "2.5.2"));//expect 1
1

Кажется, PHP работает, как вы ожидаете. Если вы сталкиваетесь с другим поведением, возможно, вам следует это указать.

29
добавлено
Может подтвердить. Просто работает. ВСЕ версии PHP. 3v4l.org/U0mvm#v430 То же самое для сравнения естественного порядка.
добавлено автор hakre, источник

Из интерактивного приглашения PHP с помощью version_compare функция, встроенная в PHP с 4,1 :

php > print_r(version_compare("2.5.1",  "2.5.2"));//expect -1
-1
php > print_r(version_compare("2.5.2",  "2.5.2"));//expect 0
0
php > print_r(version_compare("2.5.5",  "2.5.2"));//expect 1
1
php > print_r(version_compare("2.5.11", "2.5.2"));//expect 1
1

Кажется, PHP работает, как вы ожидаете. Если вы сталкиваетесь с другим поведением, возможно, вам следует это указать.

29
добавлено
Может подтвердить. Просто работает. ВСЕ версии PHP. 3v4l.org/U0mvm#v430 То же самое для сравнения естественного порядка.
добавлено автор hakre, источник

что вы можете сделать, это проанализировать каждую строку, остановиться в точке и добавить каждое число в отдельный int.

так что ваша строка 2.5.1 станет 3 целыми числами:

$ver1 . "." . $ver2 . "." . $ver3

и ваша строка 2.5.11 станет:

$ver1_2 . "." . $ver2_2 . "." . $ver3_2

то куча if для сравнения $ ver1 с $ ver1_2 и так далее.

2
добавлено

Also, you can use the PHP built-in function as below by passing an extra argument to the version_compare()

if(version_compare('2.5.2', '2.5.1', '>')) {
 print "First arg is greater than second arg";
}

Дополнительную информацию см. В version_compare .

1
добавлено

Also, you can use the PHP built-in function as below by passing an extra argument to the version_compare()

if(version_compare('2.5.2', '2.5.1', '>')) {
 print "First arg is greater than second arg";
}

Дополнительную информацию см. В version_compare .

1
добавлено

Also, you can use the PHP built-in function as below by passing an extra argument to the version_compare()

if(version_compare('2.5.2', '2.5.1', '>')) {
 print "First arg is greater than second arg";
}

Дополнительную информацию см. В version_compare .

1
добавлено

Отмеченный ответ не подходит для случая:

print_r (version_compare ("2.51.1", "2.5.1"));

Вот более надежное решение для этого:

function updateAppVersion($appVersion1, $appVersion2)
{
    $releaseVersion = explode(".",$appVersion1);

    $deviceVersion = explode(".",$appVersion2);

    if($releaseVersion[0] > $deviceVersion[0])
        return false;

    if((floatval($releaseVersion[0].'.'.$releaseVersion[1])) > (floatval($deviceVersion[0].'.'.$deviceVersion[1])))
        return false;

    //in some cases, versions are numbered only up to 2 decimal places
    if(isset($releaseVersion[2]) && isset($deviceVersion[2]))
        if($releaseVersion[2] >= $deviceVersion[2])
            return false;

    return true;
}
1
добавлено

Отмеченный ответ не подходит для случая:

print_r (version_compare ("2.51.1", "2.5.1"));

Вот более надежное решение для этого:

function updateAppVersion($appVersion1, $appVersion2)
{
    $releaseVersion = explode(".",$appVersion1);

    $deviceVersion = explode(".",$appVersion2);

    if($releaseVersion[0] > $deviceVersion[0])
        return false;

    if((floatval($releaseVersion[0].'.'.$releaseVersion[1])) > (floatval($deviceVersion[0].'.'.$deviceVersion[1])))
        return false;

    //in some cases, versions are numbered only up to 2 decimal places
    if(isset($releaseVersion[2]) && isset($deviceVersion[2]))
        if($releaseVersion[2] >= $deviceVersion[2])
            return false;

    return true;
}
1
добавлено

Отмеченный ответ не подходит для случая:

print_r (version_compare ("2.51.1", "2.5.1"));

Вот более надежное решение для этого:

function updateAppVersion($appVersion1, $appVersion2)
{
    $releaseVersion = explode(".",$appVersion1);

    $deviceVersion = explode(".",$appVersion2);

    if($releaseVersion[0] > $deviceVersion[0])
        return false;

    if((floatval($releaseVersion[0].'.'.$releaseVersion[1])) > (floatval($deviceVersion[0].'.'.$deviceVersion[1])))
        return false;

    //in some cases, versions are numbered only up to 2 decimal places
    if(isset($releaseVersion[2]) && isset($deviceVersion[2]))
        if($releaseVersion[2] >= $deviceVersion[2])
            return false;

    return true;
}
1
добавлено

Отмеченный ответ не подходит для случая:

print_r (version_compare ("2.51.1", "2.5.1"));

Вот более надежное решение для этого:

function updateAppVersion($appVersion1, $appVersion2)
{
    $releaseVersion = explode(".",$appVersion1);

    $deviceVersion = explode(".",$appVersion2);

    if($releaseVersion[0] > $deviceVersion[0])
        return false;

    if((floatval($releaseVersion[0].'.'.$releaseVersion[1])) > (floatval($deviceVersion[0].'.'.$deviceVersion[1])))
        return false;

    //in some cases, versions are numbered only up to 2 decimal places
    if(isset($releaseVersion[2]) && isset($deviceVersion[2]))
        if($releaseVersion[2] >= $deviceVersion[2])
            return false;

    return true;
}
1
добавлено

Если ваш вариант сравнения не работает, приведенный ниже код даст ваши результаты.

function new_version_compare($s1,$s2){
    $sa1 = explode(".",$s1);
    $sa2 = explode(".",$s2);
    if(($sa2[2]-$sa1[2])<0)
        return 1;
    if(($sa2[2]-$sa1[2])==0)
        return 0;
    if(($sa2[2]-$sa1[2])>0)
        return -1;
}
0
добавлено
Ну, именно поэтому я заявил, что если он не работает для вас (по какой-то причине он не спрашивал об этом иначе). Но чтобы убедиться, что я отредактировал его в новой функции
добавлено автор Hans Wassink, источник
Поклонникам Fatal Errors действительно понравится этот код.
добавлено автор hakre, источник

Если ваш вариант сравнения не работает, приведенный ниже код даст ваши результаты.

function new_version_compare($s1,$s2){
    $sa1 = explode(".",$s1);
    $sa2 = explode(".",$s2);
    if(($sa2[2]-$sa1[2])<0)
        return 1;
    if(($sa2[2]-$sa1[2])==0)
        return 0;
    if(($sa2[2]-$sa1[2])>0)
        return -1;
}
0
добавлено
Ну, именно поэтому я заявил, что если он не работает для вас (по какой-то причине он не спрашивал об этом иначе). Но чтобы убедиться, что я отредактировал его в новой функции
добавлено автор Hans Wassink, источник
Поклонникам Fatal Errors действительно понравится этот код.
добавлено автор hakre, источник

Если ваш вариант сравнения не работает, приведенный ниже код даст ваши результаты.

function new_version_compare($s1,$s2){
    $sa1 = explode(".",$s1);
    $sa2 = explode(".",$s2);
    if(($sa2[2]-$sa1[2])<0)
        return 1;
    if(($sa2[2]-$sa1[2])==0)
        return 0;
    if(($sa2[2]-$sa1[2])>0)
        return -1;
}
0
добавлено
Ну, именно поэтому я заявил, что если он не работает для вас (по какой-то причине он не спрашивал об этом иначе). Но чтобы убедиться, что я отредактировал его в новой функции
добавлено автор Hans Wassink, источник
Поклонникам Fatal Errors действительно понравится этот код.
добавлено автор hakre, источник

Если ваш вариант сравнения не работает, приведенный ниже код даст ваши результаты.

function new_version_compare($s1,$s2){
    $sa1 = explode(".",$s1);
    $sa2 = explode(".",$s2);
    if(($sa2[2]-$sa1[2])<0)
        return 1;
    if(($sa2[2]-$sa1[2])==0)
        return 0;
    if(($sa2[2]-$sa1[2])>0)
        return -1;
}
0
добавлено
Ну, именно поэтому я заявил, что если он не работает для вас (по какой-то причине он не спрашивал об этом иначе). Но чтобы убедиться, что я отредактировал его в новой функции
добавлено автор Hans Wassink, источник
Поклонникам Fatal Errors действительно понравится этот код.
добавлено автор hakre, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp