The function treats '_' as after letters and numbers when it would be placed before logically.
(PHP 4, PHP 5, PHP 7, PHP 8)
strnatcasecmp — String-Vergleich "natürlicher Ordnung" ohne Berücksichtigung der Groß- und Kleinschreibung
Die Funktion implementiert einen Vergleichsalgorithmus, der alphanumerische Zeichenketten so sortiert, wie es ein Mensch täte. Das Verhalten der Funktion entspricht strnatcmp() mit der Ausnahme, dass der Vergleich ohne Berücksichtigung von Groß- und Kleinschreibung durchgeführt wird. Weitere Informationen sind auf Martin Pools Seite » Natural Order String Comparison zu finden.
string1
Die erste Zeichenkette.
string2
Die zweite Zeichenkette.
Ähnlich anderen Zeichenketten-Vergleichsfunktionen gibt diese Funktion
-1
zurück, wenn string1
in der
Reihenfolge der Sortierung vor string2
kommt,
1
, wenn string1
nach
string2
kommt, und 0
, wenn sie
gleich sind.
Version | Beschreibung |
---|---|
8.2.0 |
Diese Funktion gibt nun -1 oder 1
zurück, wo sie vorher eine negative oder positive Zahl zurückgab.
|
Beispiel #1 strnatcasecmp()-Beispiel
<?php
var_dump(strnatcasecmp('Apple', 'Banana'));
var_dump(strnatcasecmp('Banana', 'Apple'));
var_dump(strnatcasecmp('apple', 'Apple'));
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
int(-1) int(1) int(0)
The function treats '_' as after letters and numbers when it would be placed before logically.
Use strnatcmp to avoid the _ problem as mentioned below;
<< The function treats '_' as after letters and numbers when it would be placed before logically. >>
There seems to be a bug in the localization for strnatcmp and strnatcasecmp. I searched the reported bugs and found a few entries which were up to four years old (but the problem still exists when using swedish characters).
These functions might work instead.
<?php
function _strnatcasecmp($left, $right) {
return _strnatcmp(strtolower($left), strtolower($right));
}
function _strnatcmp($left, $right) {
while((strlen($left) > 0) && (strlen($right) > 0)) {
if(preg_match('/^([^0-9]*)([0-9].*)$/Us', $left, $lMatch)) {
$lTest = $lMatch[1];
$left = $lMatch[2];
} else {
$lTest = $left;
$left = '';
}
if(preg_match('/^([^0-9]*)([0-9].*)$/Us', $right, $rMatch)) {
$rTest = $rMatch[1];
$right = $rMatch[2];
} else {
$rTest = $right;
$right = '';
}
$test = strcmp($lTest, $rTest);
if($test != 0) {
return $test;
}
if(preg_match('/^([0-9]+)([^0-9].*)?$/Us', $left, $lMatch)) {
$lTest = intval($lMatch[1]);
$left = $lMatch[2];
} else {
$lTest = 0;
}
if(preg_match('/^([0-9]+)([^0-9].*)?$/Us', $right, $rMatch)) {
$rTest = intval($rMatch[1]);
$right = $rMatch[2];
} else {
$rTest = 0;
}
$test = $lTest - $rTest;
if($test != 0) {
return $test;
}
}
return strcmp($left, $right);
}
?>
The code is not optimized. It was just made to solve my problem.