PHP’nin Türkçe karakter sorunundan bahsetmiştik. Dizi elemanlarını sıralarken vs de bir sorunu olduğunu ve bu sorunu nasıl giderebileceğinizden bahsetmeye çalıştım.
PHP’de string compare (karşılaştırma) function’ı strcmp ve bu function’ın Türkçe karakter desteği bulunmamakta. Türkçe karakter sorununu gidermek için yazdığım yazıdaki mb_* functionları arasında compare yok ( ya da ben göremedim ). Bunun için kendi yazdığım, şu zamana kadar bir sorunsuz çalışan function’ı paylaşmak istedim. Sorunuz veya hata gördüğünüz bir şey olursa, lütfen bildiriniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function tr_strcmp ( $a , $b ) { $lcases = array( 'a' , 'b' , 'c' , 'ç' , 'd' , 'e' , 'f' , 'g' , 'ğ' , 'h' , 'ı' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'ö' , 'p' , 'q' , 'r' , 's' , 'ş' , 't' , 'u' , 'ü' , 'w' , 'v' , 'y' , 'z' ); $ucases = array ( 'A' , 'B' , 'C' , 'Ç' , 'D' , 'E' , 'F' , 'G' , 'Ğ' , 'H' , 'I' , 'İ' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' , 'Ö' , 'P' , 'Q' , 'R' , 'S' , 'Ş' , 'T' , 'U' , 'Ü' , 'W' , 'V' , 'Y' , 'Z' ); $am = mb_strlen ( $a , 'UTF-8' ); $bm = mb_strlen ( $b , 'UTF-8' ); $maxlen = $am > $bm ? $bm : $am; for ( $ai = 0; $ai < $maxlen; $ai++ ) { $aa = mb_substr ( $a , $ai , 1 , 'UTF-8' ); $ba = mb_substr ( $b , $ai , 1 , 'UTF-8' ); if ( $aa != $ba ) { $apos = in_array ( $aa , $lcases ) ? array_search ( $aa , $lcases ) : array_search ( $aa , $ucases ); $bpos = in_array ( $ba , $lcases ) ? array_search ( $ba , $lcases ) : array_search ( $ba , $ucases ); if ( $apos !== $bpos ) { return $apos > $bpos ? 1 : -1; } } } return 0; } |
Aynı, strcmp functionındaki gibi; 1. argüman alfabatik olarak 2. den:
- önce gelir ise : -1
- sonra gelir ise : 1
- eşitse : 0
geri döner.
Örnek;
1 2 3 4 5 6 7 8 9 10 11 |
var_dump( tr_strcmp ( 'a', 'b') ); // cikti : int(-1) var_dump( tr_strcmp ( 'b', 'a') ); // cikti : int(1) var_dump( tr_strcmp ( 'a', 'a') ); // cikti : int(0) var_dump( tr_strcmp ( 'ali', 'ala') ); // cikti : int(1) |
Örnek 2: strcmp ve tr_strcmp functionlarıyla dizi sıralama
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$dizi = array('Adem', 'İlkay', 'Işık', 'Ömer', 'Orhan', 'Ceren', 'Çağla', 'Zeynep'); usort($dizi, 'strcmp'); var_dump($dizi); /* cikti : array(8) { [0]=> string(4) "Adem" [1]=> string(5) "Ceren" [2]=> string(6) "Işık" [3]=> string(5) "Orhan" [4]=> string(6) "Zeynep" [5]=> string(7) "Çağla" [6]=> string(5) "Ömer" [7]=> string(6) "İlkay" } */ usort($dizi, 'tr_strcmp'); var_dump($dizi); /* cikti : array(8) { [0]=> string(4) "Adem" [1]=> string(5) "Ceren" [2]=> string(7) "Çağla" [3]=> string(6) "Işık" [4]=> string(6) "İlkay" [5]=> string(5) "Orhan" [6]=> string(5) "Ömer" [7]=> string(6) "Zeynep" } */ |
hakan
Eyvallah Ahmet.
Ömür Yanıkoğlu
Elinize sağlık, çok teşekkürler :)
HakanY
Çok Teşekkürler .