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
int strnatcmp
( 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. 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
)
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
thomas at uninet dot se ¶
6 years ago
