Start · Sprachen · PHP · Referenz · gmp_cmp

gmp_cmp

Funktion

Vergleicht zwei GMP-Zahlen und gibt einen negativen Wert, 0 oder einen positiven Wert zurück.

seit PHP 4.0.4 Kategorie: math

Signatur

gmp_cmp(GMP|int|string $num1, GMP|int|string $num2): int

Beschreibung

gmp_cmp vergleicht zwei beliebig große ganze Zahlen, die als GMP-Objekte, native PHP-Integers oder numerische Strings übergeben werden können. Die Funktion gehört zur GMP-Erweiterung (GNU Multiple Precision Arithmetic Library) und eignet sich damit für Berechnungen mit Zahlen, die den Wertebereich von PHP-Integers überschreiten.

Der Rückgabewert folgt der in vielen Vergleichsfunktionen üblichen Konvention: Ein negativer Wert bedeutet, dass num1 kleiner als num2 ist; 0 bedeutet Gleichheit; ein positiver Wert bedeutet, dass num1 größer als num2 ist. Damit lässt sich gmp_cmp direkt als Comparator-Callback, z. B. in usort, einsetzen.

Typische Einsatzgebiete sind kryptografische Algorithmen (RSA, Diffie-Hellman), mathematische Berechnungen mit sehr großen Primzahlen sowie überall dort, wo normale PHP-Integerarithmetik aufgrund von Größenbeschränkungen nicht ausreicht.

Parameter

Name Typ Default Beschreibung
$num1 Pflicht GMP|int|string Die erste zu vergleichende Zahl. Kann ein GMP-Objekt, ein PHP-Integer oder ein numerischer String sein.
$num2 Pflicht GMP|int|string Die zweite zu vergleichende Zahl. Kann ein GMP-Objekt, ein PHP-Integer oder ein numerischer String sein.

Rückgabewert

Typ
int
Beschreibung
Gibt einen negativen Wert zurück, wenn num1 kleiner als num2 ist; 0, wenn beide Zahlen gleich sind; und einen positiven Wert, wenn num1 größer als num2 ist.

Beispiele

Einfacher Vergleich zweier GMP-Zahlen

<?php
$a = gmp_init('12345678901234567890');
$b = gmp_init('9876543210987654321');

$result = gmp_cmp($a, $b);

if ($result < 0) {
    echo "a ist kleiner als b";
} elseif ($result === 0) {
    echo "a und b sind gleich";
} else {
    echo "a ist größer als b";
}
a ist größer als b

Sortieren eines Arrays von GMP-Zahlen mit usort

<?php
$zahlen = [
    gmp_init('999999999999999999'),
    gmp_init('1'),
    gmp_init('123456789012345678'),
    gmp_init('42'),
];

usort($zahlen, 'gmp_cmp');

foreach ($zahlen as $z) {
    echo gmp_strval($z) . "\n";
}
1 42 123456789012345678 999999999999999999

Vergleich mit negativen Zahlen

<?php
$positiv = gmp_init('100');
$negativ = gmp_init('-100');

$cmp = gmp_cmp($negativ, $positiv);
echo $cmp < 0 ? "-100 ist kleiner als 100" : "Unerwartetes Ergebnis";
-100 ist kleiner als 100

// Wichtig · Fallstricke

GMP-Erweiterung erforderlich: Die Funktion setzt voraus, dass PHP mit der GMP-Bibliothek kompiliert wurde (Erweiterung gmp). Ohne diese Erweiterung ist die Funktion nicht verfügbar. Seit PHP 5.6 werden GMP-Objekte automatisch aus Integers und numerischen Strings erstellt, sodass man gmp_init nicht immer explizit aufrufen muss.

Rückgabewert nicht auf ±1 normiert: Im Gegensatz zu einigen anderen Sprachen ist der zurückgegebene Wert nicht zwingend genau -1, 0 oder 1. Es sollte daher stets geprüft werden, ob das Ergebnis kleiner, gleich oder größer als 0 ist — kein direkter Vergleich auf -1 oder 1.