mattl
mattl

Reputation: 2242

How to get the highest version number / tag in PHP

Because the Bitbucket API doesn't provide a method to get the latest tag for a repository I find myself having to get it from an array of all tags.

How do you do it?

I have tried max but it doesn't work for certain numbers e.g.

max(['1.0.8', '1.0.9', '1.0.10']);

returns '1.0.9'.

I know the tags will only ever be three numbers a.b.c they won't have other semver accepted strings like alpha etc. because of the way we do tags for our repos.

So how do you do it?

Upvotes: 12

Views: 1266

Answers (3)

Andrew M
Andrew M

Reputation: 785

Because you are dealing with Strings here rather than numbers, you will not get the result you require. You could try the following:

$version_numbers = str_replace(".","",['1.0.8', '1.0.9', '1.0.10']);
$max = max($version_numbers);

If you are always dealing with a fixed a.b.c structure then by replacing the decimal point you will get a series of integers that will let you determine the maximum relatively easily

Upvotes: -1

deceze
deceze

Reputation: 522500

$versions = ['1.0.8', '1.0.9', '1.0.10'];
usort($versions, 'version_compare');
echo end($versions);

See http://php.net/version_compare

If you don't feel like modifying the array:

echo array_reduce($versions, function ($highest, $current) {
    return version_compare($highest, $current, '>') ? $highest : $current;
});

Upvotes: 16

A.L
A.L

Reputation: 10513

By using the version_compare function:

function maxVersion($array)
{
    $max = null;

    foreach ($array as $version) {
        if (version_compare($max, $version) === -1) {
            $max = $version;
        }
    }

    return $max;
}

print(maxVersion(['1.0.8', '1.0.9', '1.0.10']));
// returns "1.0.10"

Upvotes: 1

Related Questions