strcoll()'s behavior is sometimes a little bit confusing. It depends on LC_COLLATE in your locale.
<?php
$a = 'a';
$b = 'A';
print strcmp ($a, $b) . "\n"; // prints 1
setlocale (LC_COLLATE, 'C');
print "C: " . strcoll ($a, $b) . "\n"; // prints 1
setlocale (LC_COLLATE, 'de_DE');
print "de_DE: " . strcoll ($a, $b) . "\n"; // prints -2
setlocale (LC_COLLATE, 'de_CH');
print "de_CH: " . strcoll ($a, $b) . "\n"; // prints -2
setlocale (LC_COLLATE, 'en_US');
print "en_US: " . strcoll ($a, $b) . "\n"; // prints -2
?>
This is useful e. g. if want to sort an array by using strcoll:
<?php
$a = array ('a', 'A', '', '', 'b', 'B');
setlocale (LC_COLLATE, 'C');
usort ($a, 'strcoll');
print_r ($a);
?>
This is like sort($a):
Array
(
[0] => A
[1] => B
[2] => a
[3] => b
[4] =>
[5] =>
)
<?php
setlocale (LC_COLLATE, 'de_DE');
usort ($a, 'strcoll');
print_r ($a)
?>
This is completely different:
Array
(
[0] => a
[1] => A
[2] =>
[3] =>
[4] => b
[5] => B
)
strcoll
(PHP 4 >= 4.0.5, PHP 5)
strcoll — Σύγκριση string βασισμένη στο locale
Περιγραφή
Επιστρέφει < 0 εάν η παράμετρος str1 είναι μικρότερη της str2 , > 0 εάν η str1 είναι μεγαλύτερη της str2 , και 0 εάν οι δύο παράμετροι είναι ίσες. Η συνάρτηση strcoll() χρησιμοποιεί το τρέχον locale για την υλοποίηση των συγκρίσεων. Εάν αυτό είναι C ή POSIX, η συνάρτηση έχει την ίδια λειτουργία με την strcmp().
Προσέξτε ότι η σύγκριση είναι case sensitive, και ότι διαφέρει από την strcmp() στο ότι δεν είναι binary safe.
Note: Η συνάρτηση strcoll() προστέθηκε στην PHP 4.0.5, αλλά δεν ήταν διαθέσιμη για win32 μέχρι την έκδοση 4.2.3.
Ανατρέξτε επίσης στις: ereg(), strcmp(), strcasecmp(), substr(), stristr(), strncasecmp(), strncmp(), strstr(), και setlocale().
strcoll
22-Mar-2003 11:31
Note that some platforms implement strcmp() and strcasecmp() according to the current locale when strings are not binary equal, so that strcmp() and strcoll() will return the same value! This depends on how the PHP strcmp() function is compiled (i.e. if it uses the platform specific strcmp() found in its standard library!).
In that case, the only difference between strcoll() and strcmp() is that strcoll() may return 0 for distinct strings(i.e. consider strings are equal) while strcmp() will differentiate them if they have distinct binary encoding! This typically occurs on Asian systems.
What you can be sure is that strcmp() will always differentiate strings that are encoded differently, but the relative order may still use the current locale setting for collation order!
