The function treats '_' as after letters and numbers when it would be placed before logically.
strnatcasecmp
(PHP 4, PHP 5)
strnatcasecmp — "Doğal sıralama" algoritmasını kullanarak dizgeleri harf büyüklüğüne duyarsız olarak karşılaştırır
Açıklama
int strnatcasecmp
( string
$d1
, string $d2
)Bu işlev, "doğal sıralama" adı verilen ve alfasayısal dizgeleri insanlarca yapılan sıralamaya uygun olarak sıralayan bir algoritmayı gerçekler. strnatcmp() işlevinden farklı olarak karşılaştırma harf büyüklüğüne duyarlı değildir. Daha fazla bilgi için Martin Pool'un » Natural Order String Comparison belgesine bakınız.
Değiştirgeler
-
d1 -
İlk dizge.
-
d2 -
İkinci dizge.
Dönen Değerler
d1 dizgesi d2 dizgesinden
küçükse sıfırdan küçük bir değer; d1 dizgesi
d2 dizgesinden büyükse sıfırdan büyük bir değer;
d1 dizgesi ile d2 dizgesi
aynıysa sıfır döndürür.
Ayrıca Bakınız
- preg_match() - Bir düzenli ifadeyi eşleştirmeye çalışır
- strcmp() - İkil olarak güvenilir dizge karşılaştırması yapar
- strcasecmp() - İkil olarak güvenilir ve harf büyüklüğüne duyarsız dizge karşılaştırması yapar
- substr() - Dizgenin bir kısmını döndürür
- stristr() - Harf büyüklüğüne duyarsız olarak ilk alt dizgeyi bulur
- strncasecmp() - İlk n karakteri ikil ve harf büyüklüğüne duyarsız olarak karşılaştırır
- strncmp() - İlk n karakteri ikil olarak karşılaştırır
- strstr() - İlk alt dizgeyi bulur
- setlocale() - Yereli ayarlar
chatfielddaniel at googlemail dot com ¶
2 years ago
thomas at uninet dot se ¶
6 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.
