strnatcasecmp

(PHP 4, PHP 5, PHP 7, PHP 8)

strnatcasecmp String-Vergleich "natürlicher Ordnung" ohne Berücksichtigung der Groß- und Kleinschreibung

Beschreibung

strnatcasecmp(string $string1, string $string2): int

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.

Parameter-Liste

string1

Die erste Zeichenkette.

string2

Die zweite Zeichenkette.

Rückgabewerte

Ä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.

Changelog

Version Beschreibung
8.2.0 Diese Funktion gibt nun -1 oder 1 zurück, wo sie vorher eine negative oder positive Zahl zurückgab.

Beispiele

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)

Siehe auch

  • preg_match() - Führt eine Suche mit einem regulären Ausdruck durch
  • strcmp() - Vergleich zweier Strings (binärsicher)
  • strcasecmp() - Vergleich von Zeichenketten ohne Unterscheidung der Groß- und Kleinschreibung (binärsicher)
  • substr() - Liefert einen Teil eines Strings
  • stristr() - Wie strstr, aber unabhängig von Groß- bzw. Kleinschreibung
  • strncasecmp() - Binärsicherer Vergleich von Zeichenketten der ersten n Zeichen ohne Berücksichtigung der Groß- und Kleinschreibung
  • strncmp() - String-Vergleich der ersten n Zeichen (binärsicher)
  • strstr() - Findet das erste Vorkommen eines Strings
  • setlocale() - Legt regionale (locale) Einstellungen fest

add a note add a note

User Contributed Notes 3 notes

up
9
chatfielddaniel at googlemail dot com
13 years ago
The function treats '_' as after letters and numbers when it would be placed before logically.
up
2
Marco
8 years ago
Use strnatcmp to avoid the _ problem as mentioned below;

<<  The function treats '_' as after letters and numbers when it would be placed before logically. >>
up
-10
thomas at uninet dot se
18 years ago
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.
To Top