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"; setlocale (LC_COLLATE, 'C');
 print "C: " . strcoll ($a, $b) . "\n"; setlocale (LC_COLLATE, 'de_DE');
 print "de_DE: " . strcoll ($a, $b) . "\n"; setlocale (LC_COLLATE, 'de_CH');
print "de_CH: " . strcoll ($a, $b) . "\n"; setlocale (LC_COLLATE, 'en_US');
 print "en_US: " . strcoll ($a, $b) . "\n"; ?>
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
 )