Таким образом, для сортировки символов «0» и «ж» мы входим в строку «0» и находим колонку «ж». Там мы обнаруживаем +1, и это значение должна возвратить функция сравнения в данном случае, потому что считается, что «О» больше, чем «эе». Массив симметричен- по диагонали располагаются нули, потому что при сравнении, скажем, «а» и «а» функция должна возвратить ноль:
$matrix = array(
'ае'=> array('ае' => 0, '0' => -1, '5'=> -1),
V =>array('ae' =>+1, '0' => О, => -1),
'S' =>-array('ае' =>+1, '0' => +1, й'=> О));
Затем у нас есть несколько довольно неприятно выглядящих операторов if-
then-else(). Первый оператор проверяет, является ли $a[$i] особым символом. Если так, проверяем и $b[$i].
Если оба символа специальные, используем для сортировки двумерный массив. Если $a[$i] - особый символ, a [$i] - нет, считаем, что $a[$i] больше, чем $b[$i], и возвращаем 1. Если ни $a[$i], ни $b[$i] не являются специальными символами, применяем для сравнения строк стандартный способ РНР - функцию strcmpO. Она безопасна для двоичного сравнения, нечувствительна к регистру и не работает с управляющими символами:
// $a[$i] является специальным символом if (strrpos($special_chars, $a[$i])) { // Both characters are special ifj Jstrrpos($special_chars, $b[$i])) { $a[$i] is greater than $b[$i] because it is a special character. */ return Smat rix[$a[$i]][$b[$i]]; > else
return 1;
}
// $b[$i] является специальным символом } elseif (Strrpos($speclal_chars, $b[$i])) { // Both characters are special /if (strrpos($special_chars, $a[$i])){ •У* $a[$i] is less than $b[$i] because it is not a character. */ return$matrix[$at$i]][$b[$i]]; } else { . return .
}
ffl^else { /* Ни один из символов не является специальным */
return strcmp($a, $b);
)
I
?>
Адаптация этой функции к другим языкам должна оказаться довольно простой. Надо лишь изменить двумерный массив. Это должно быть совершенно просто благодаря его симметрическому виду.
Кодировка символов
Важно разобраться, каким образом символы, которые мы пишем в сценариях РНР, обрабатываются самим РНР и броузером.
Вывод с учетом локали
РНР особенно не интересуется кодировкой символов. Он просто читает строки и пересылает содержимое броузеру. Это означает, что надо следить за ловушками, в которые можно попасть, создавая перевод на греческий язык. Обычно интерпретация посылаемых символов возлагается на броузер. Но иногда выбор набора символов важен.