PHP Doku:: String-Vergleich unter Verwendung einer "natürlichen Ordnung" - function.strnatcmp.html

Verlauf / Chronik / History: (7) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzTextverarbeitungZeichenkettenString-Funktionenstrnatcmp

Ein Service von Reinhard Neidl - Webprogrammierung.

String-Funktionen

<<strnatcasecmp

strncasecmp>>

strnatcmp

(PHP 4, PHP 5)

strnatcmpString-Vergleich unter Verwendung einer "natürlichen Ordnung"

Beschreibung

int strnatcmp ( string $str1 , string $str2 )

Diese Funktion implemetiert einen Vergleichsalgorithmus, der alphanumerische Zeichenketten "menschlich" ordnet (auch "natürliche Ordnung" genannt). Beachten Sie, dass der Vergleich Groß- und Kleinschreibung berücksichtigt.

Parameter-Liste

str1

Die erste Zeichenkette.

str2

Die zweite Zeichenkette.

Rückgabewerte

Gibt einen Wert < 0 zurück, wenn str1 in der natürlichen Sortierung vor str2 steht, einen Wert > 0, wenn str1 in der natürlichen Sortierung hinter str2 steht, und 0, wenn sie gleich sind.

Beispiele

Der Unterschied zwischen dieser und der regulären String-Sortierung eines Computers (wie sie strcmp() verwendet) wird in dem folgenden Beispiel gezeigt:

<?php
$arr1 
$arr2 = array("img12.png""img10.png""img2.png""img1.png");
echo 
"Normaler String-Vergleich\n";
usort($arr1"strcmp");
print_r($arr1);
echo 
"\nVergleich mittels natürlicher Ordnung\n";
usort($arr2"strnatcmp");
print_r($arr2);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Normaler String-Vergleich
Array
(
    [0] => img1.png
    [1] => img10.png
    [2] => img12.png
    [3] => img2.png
)

Vergleich mittels natürlicher Ordnung
Array
(
    [0] => img1.png
    [1] => img2.png
    [2] => img10.png
    [3] => img12.png
)
Weitere Informationen finden Sie auf Martin Pools » Natural Order String Comparison-Seite.

Siehe auch

  • preg_match() - Führt eine Suche mit einem regulären Ausdruck durch
  • strcasecmp() - Vergleich von Zeichenketten ohne Unterscheidung der Groß- und Kleinschreibung (Binary safe)
  • substr() - Gibt einen Teil eines Strings zurück
  • stristr() - Wie strstr, aber unabhängig von Groß- bzw. Kleinschreibung
  • strcmp() - Vergleich zweier Strings (Binary safe)
  • strncmp() - String-Vergleich der ersten n Zeichen (Binary safe)
  • strncasecmp() - Binärdaten-sicherer und groß- und kleinschreibungs-unabhängiger Stringvergleich der ersten n Zeichen
  • strnatcasecmp() - String-Vergleich "natürlicher Ordnung" ohne Unterscheidung der Schreibweise
  • strstr() - Findet das erste Vorkommen eines Strings
  • natsort() - Sortiert ein Array in "natürlicher Reihenfolge"
  • natcasesort() - Sortiert ein Array in "natürlicher Reihenfolge", Groß/Kleinschreibung wird ignoriert


2 BenutzerBeiträge:
- Beiträge aktualisieren...
Zero
4.12.2010 23:14
If you want to compare $_SESSION variables to a string use this

<?php
if(isset($_SESSION['usertype']))
{   
     echo
"usertype " .$_SESSION['usertype'];
               
    
$ut = $_SESSION['usertype'];
               
     if(
strnatcmp($ut,"admin"))
     {
          echo
"hello admin";
     }
}
?>
thomas at uninet dot se
25.07.2006 9:50
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.



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)