The function treats '_' as after letters and numbers when it would be placed before logically.
(PHP 4, PHP 5, PHP 7, PHP 8)
strnatcasecmp — "Doğal sıralama" algoritmasını kullanarak dizgeleri harf büyüklüğüne duyarsız olarak karşılaştırır
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.
dizge1
İlk dizge.
dizge2
İkinci dizge.
dizge1
dizgesi dizge2
dizgesinden küçükse -1
; dizge1
dizgesi dizge2
dizgesinden büyükse
1
; dizge1
dizgesi ile
dizge2
dizgesi aynıysa sıfır döndürür.
Sürüm: | Açıklama |
---|---|
8.2.0 |
Bu işlev artık -1 veya 1 döndürüyor,
evvelce pozitif vaya negatif bir sayı döndürürdü.
|
Örnek 1 - strnatcasecmp() örneği
<?php
var_dump(strnatcasecmp('Apple', 'Banana'));
var_dump(strnatcasecmp('Banana', 'Apple'));
var_dump(strnatcasecmp('apple', 'Apple'));
?>
Yukarıdaki örneğin çıktısı:
int(-1) int(1) int(0)
The function treats '_' as after letters and numbers when it would be placed before logically.
Use strnatcmp to avoid the _ problem as mentioned below;
<< The function treats '_' as after letters and numbers when it would be placed before logically. >>
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.