2016-02-24 37 views
8

Vì API Bitbucket không cung cấp phương thức để lấy thẻ mới nhất cho kho lưu trữ, tôi thấy mình phải lấy nó từ một mảng của tất cả các thẻ.Cách lấy số/phiên bản cao nhất trong PHP

Bạn làm như thế nào?

Tôi đã thử max nhưng không hoạt động đối với một số con số cụ thể, ví dụ:

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

trả về '1.0.9'.

Tôi biết các thẻ sẽ chỉ bao giờ là ba số a.b.c chúng sẽ không có các semver khác chấp nhận các chuỗi như alpha, vv vì cách chúng tôi thực hiện các thẻ cho bản repos của chúng tôi.

Vậy bạn làm như thế nào?

Trả lời

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

Xem http://php.net/version_compare

Nếu bạn không cảm thấy như sửa đổi các mảng:

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

Ồ wow phần này của [version_compare] (http://php.net/version_compare) là tuyệt vời 'Nếu một phần chứa chuỗi phiên bản đặc biệt, chúng được xử lý theo thứ tự sau: bất kỳ chuỗi nào không được tìm thấy trong danh sách này

+0

Thật đáng kinh ngạc, vâng. – deceze

+0

wow các bạn nhanh quá! – mattl

1

Bằng việc sử dụng version_compare chức năng:

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" 
-1

Bởi vì bạn đang đối phó với Strings ở đây thay vì số, bạn sẽ không nhận được kết quả mà bạn yêu cầu. Bạn có thể thử như sau:

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

Nếu bạn luôn làm việc với một cố định abc cấu trúc sau đó bằng cách thay thế các dấu thập phân bạn sẽ nhận được một loạt các số nguyên mà sẽ cho phép bạn xác định tối đa tương đối dễ dàng

+3

Uhm ... ''10 .1 ',' 1.01'' ... Các dấu thập phân có phần quan trọng ... – deceze

+0

Đó là điểm công bằng –

+2

Khi bạn phát hiện ra rằng' 1010' là số tối đa của 3, điều sẽ bạn trở lại? '1010'? Làm thế nào bạn sẽ làm cho nó '1.0.10' –

Các vấn đề liên quan