function utf8_ord($c)
{
switch( strlen($c) )
{
case 1:
return ord($c);
break;
case 2:
return ((ord($c[0]) & 0x1F) << 6) | (ord($c[1]) & 0x3F);
break;
case 3:
return ((ord($c[0]) & 0x0F) << 12) | ((ord($c[1]) & 0x3F) << 6) | (ord($c[2]) & 0x3F);
break;
case 4:
return ((ord($c[0]) & 0x07) << 18) | ((ord($c[1]) & 0x3F) << 12) | ((ord($c[2]) & 0x3F) << 6) | (ord($c[3]) & 0x3F);
break;
default:
return FALSE;
}
}
function cmp($s1, $s2)
{
$l = min($l1 = mb_strlen($s1, 'utf-8'), $l2 = mb_strlen($s2, 'utf-8'));
$s1 = preg_split('//u', mb_strtolower($s1, 'utf-8'));
$s2 = preg_split('//u', mb_strtolower($s2, 'utf-8'));
for($i = 0; $i < $l; $i++)
{
if( $s1[$i] != $s2[$i] )
return utf8_ord($s1[$i]) - utf8_ord($s2[$i]);
}
if( $l1 > $l )
{
return 1;
}
else if( $l2 > $l )
{
return -1;
}
return 0;
}
usort($array, 'cmp');