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.
strnatcmp
(PHP 4, PHP 5)
strnatcmp — "Doğal sıralama" algoritmasını kullanarak dizgeleri karşılaştırır
Açıklama
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. Karşılaştırma harf büyüklüğüne duyarlı olarak yapılır.
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.
Örnekler
Bu örnekte, bilgisiyar dizge sıralaması yapan strcmp() işlevi ile insani dizge sıralaması yapan strnatcmp() işlevinin sonuçları karşılaştırılmıştır:
<?php
$arr1 = $arr2 = array("img12.png", "img10.png", "img2.png", "img1.png");
echo "Standart dizge karşılaştırması\n";
usort($arr1, "strcmp");
print_r($arr1);
echo "\nDoğal dizge sıralama karşılaştırması\n";
usort($arr2, "strnatcmp");
print_r($arr2);
?>
Yukarıdaki örneğin çıktısı:
Standart dizge karşılaştırması
Array
(
[0] => img1.png
[1] => img10.png
[2] => img12.png
[3] => img2.png
)
Doğal dizge sıralama karşılaştırması
Array
(
[0] => img1.png
[1] => img2.png
[2] => img10.png
[3] => img12.png
)
Daha fazla bilgi için bakınız: Martin Pool'un » Natural Order String Comparison belgesi.
Ayrıca Bakınız
- preg_match() - Bir düzenli ifadeyi eşleştirmeye çalışır
- 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
- strcmp() - İkil olarak güvenilir dizge karşılaştırması yapar
- strncmp() - İlk n karakteri ikil olarak karşılaştırır
- strncasecmp() - İlk n karakteri ikil ve harf büyüklüğüne duyarsız olarak karşılaştırır
- strnatcasecmp() - "Doğal sıralama" algoritmasını kullanarak dizgeleri harf büyüklüğüne duyarsız olarak karşılaştırır
- strstr() - İlk alt dizgeyi bulur
- natsort() - Bir diziyi "doğal sıralama" algoritmasıyla sıralar
- natcasesort() - Bir diziyi harf büyüklüğüne duyarsız "doğal sıralama" algoritmasıyla sıralar
strnatcmp
25-Jul-2006 07:50
