2012-12-28 66 views
5

Cách so sánh hai chuỗi ở định dạng phiên bản? ví dụ rằng:So sánh hai chuỗi phiên bản trong 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) 
+2

lẽ * "trật tự tự nhiên" *, Bạn đã thử http://php.net/strnatcmp? – hakre

+0

Có gì sai với nội trang của php ['version_compare'] (http://php.net/manual/en/function.version-compare.php)? – DCoder

+3

Kiểm tra mã của bạn trước khi bạn yêu cầu. Tôi chỉ có thể làm việc (như trong trường hợp của bạn). -1 cho điều đó. – hakre

Trả lời

22

Từ dấu nhắc tương tác PHP sử dụng version_compare chức năng, tích hợp sẵn trong PHP kể từ 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 

Dường như PHP đã hoạt động như bạn mong đợi. Nếu bạn đang gặp phải hành vi khác nhau, có lẽ bạn nên xác định điều này.

+2

Có thể xác nhận. Chỉ cần làm việc. Tất cả các phiên bản PHP. http://3v4l.org/U0mvm#v430 Tương tự với thứ tự so sánh. – hakre

0

Nếu so sánh phiên bản của bạn không hoạt động, mã bên dưới sẽ tạo ra kết quả của bạn.

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; 
} 
+1

Người hâm mộ Lỗi nghiêm trọng thực sự có thể yêu thích mã này. – hakre

+0

Vâng đó là lý do tại sao tôi nói nếu nó không làm việc cho bạn, (vì một lý do nó không nếu không, ông sẽ không hỏi). Nhưng để đảm bảo tôi đã chỉnh sửa nó thành một hàm new_ –

-2

những gì bạn có thể làm là phân tích từng chuỗi, dừng tại dấu chấm và thêm từng số vào một int riêng biệt.

để chuỗi của bạn 2.5.1 sẽ trở thành 3 số nguyên:

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

và chuỗi của bạn 2.5.11 sẽ trở thành:

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

sau đó một bó nếu là để so sánh $ ver1 với $ ver1_2 và như vậy.

0

Ngoài ra, bạn có thể sử dụng PHP tích hợp chức năng như sau bằng cách thông qua một cuộc tranh cãi bổ sung cho các version_compare()

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

Xin xem version_compare cho các truy vấn thêm.

0

Câu trả lời rõ rệt thất bại đối với trường hợp:

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

Dưới đây là một giải pháp đáng tin cậy nhiều đến thế này:

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; 
} 
Các vấn đề liên quan