Аргерих Л. О языке РНР. Часть 5. Страница 56


Таким образом, для сортировки символов «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

?>

Адаптация этой функции к другим языкам должна оказаться довольно простой. Надо лишь изменить двумерный массив. Это должно быть совер­шенно просто благодаря его симметрическому виду.

Кодировка символов

Важно разобраться, каким образом символы, которые мы пишем в сценари­ях РНР, обрабатываются самим РНР и броузером.

Вывод с учетом локали

РНР особенно не интересуется кодировкой символов. Он просто читает стро­ки и пересылает содержимое броузеру. Это означает, что надо следить за ло­вушками, в которые можно попасть, создавая перевод на греческий язык. Обычно интерпретация посылаемых символов возлагается на броузер. Но иногда выбор набора символов важен.