2012-06-12 15 views
12
version_compare('5.2', '5.2.0'); // returns -1, as if the second parameter is greater! 

Czy 5.2 i 5.2.0 nie są równe? (czy nie 5.2 i 5.2.0.0 są równe)?PHP: version_compare() zwraca -1 przy porównywaniu 5.2 i 5.2.0?

+2

Czy kiedykolwiek [przeczytałeś instrukcję] (http://php.net/version_compare)? – Teneff

+3

Przeczytałem instrukcję przed zadaniem pytania, ale dopiero teraz nauczyłem się znaczenia "wersji standardowej PHP" – evilReiko

Odpowiedz

11

Dokumentacja mówi, że porównuje "dwa" standaryzowane numery PHP "ciągi numerów wersji".

Porównujesz jeden standardowy numer wersji PHP z jednym standardem numeru wersji znormalizowanym poza PHP.

+1

Zadałem to pytanie, ponieważ używam version_compare do porównywania również wersji mysql, wersji Zend i innych wtyczek .. ale myślę, że słowo "standaryzowane PHP" oznacza, że ​​version_compare powinno być używane tylko do porównywania wersji PHP, prawda? – evilReiko

+1

Powiedziałbym, że to całkiem bezpieczny zakład. – ceejayoz

+1

Nie, będzie działać z numerami wersji dla innych programów/bibliotek, ale tylko jeśli będą one zgodne ze wzorcem opisanym w instrukcji –

4

Sekwencje 5.2 i 5.2.0 są standaryzowanymi wersjami PHP. AFAIU 5.2 oznacza 5.2.0, 5.2.1, itd. Wynik jest logiczny, 5.2 nie może być równy 5.2.1 lub 5.2.0, a na przykład nie może być większy niż 5.2.0.
Więc tylko oczekiwane zachowanie jest 5,2 < 5.2.0, 5.2.1 5.2 < ...

Btw nawet stany dokumentacja:

W ten sposób nie tylko wersje z różnych poziomach, takich jak '4.1' i „4.1.2” można porównać, ale także ...

+0

Dokładnie, jakość dokumentacji PHP może być naprawdę żartem. Potrzebujemy lepszych standardów – Pacerier

7

Oto Tweaked porównać funkcja, która zachowuje się zgodnie z oczekiwaniami przez przycinanie elementów zerowych wersja sufiks, tj 5.2.0 ->5.2.

var_dump(my_version_compare('5.1', '5.1.0'));   // 0 - equal 
var_dump(my_version_compare('5.1', '5.1.0.0'));   // 0 - equal 
var_dump(my_version_compare('5.1.0', '5.1.0.0-alpha')); // 1 - 5.1.0.0-alpha is lower 
var_dump(my_version_compare('5.1.0-beta', '5.1.0.0')); // -1 - 5.1.0-beta is lower 

function my_version_compare($ver1, $ver2, $operator = null) 
{ 
    $p = '#(\.0+)+($|-)#'; 
    $ver1 = preg_replace($p, '', $ver1); 
    $ver2 = preg_replace($p, '', $ver2); 
    return isset($operator) ? 
     version_compare($ver1, $ver2, $operator) : 
     version_compare($ver1, $ver2); 
} 
+0

Niesamowite rozwiązanie! Napisano wiele testów jednostkowych i działa jak urok :) dziękuję –

Powiązane problemy