// Один пробел между суммой и знаком. "110' => '(' . $currency_symbol . ' %s)', '111' => Ssign , $currency_symbol . %s', '112' => $currency_symbol . ' %s' . Ssign, '113' => Ssign . $currency_symbol . ' %s', ' 114'=> Scurrency^symbol . ' ' . Ssign . '%s');
// Ищем ключ в массиве.
return sprintf($formats[$key], Snumber);
Каждая строка формата, ключ которой оканчивается нулем, помещает число в круглые скобки. Если бы мы не отбрасывали знак числа, он помешал бы в этих случаях, поскольку результат был бы (-123.45), тогда как должно быть (123.45).
Функция завершается вызовом sprintf с правильной строкой формата.
Сортировка
В РНР есть встроенные функции, действующие над массивами и сортирующие их разными способами. В целом, сортировка специальных символов языка осуществляется некорректно. Например, в датском языке есть три специальных символа: ае, 0 и а. Эти символы должны сортироваться в указанном порядке, но РНР сортирует их так: а, ее и 0.
Проблема в том, что РНР сортирует символы в соответствии с их ASCII-кода- ми. ASCII-код заданной буквы легко определить с помощью встроенной функции ord():
$ascii = а г ray (
'а' => ord( 'а'), 'b' => ord( 'b'), 'с => ord( 'с'), ее' => o'rd( ае'), '0 => ord( '0'), 'а' => ord('a'));
echo("<pre>\n"); print_r($ascii); echo("</pre>\n");
Этот код дает следующий результат (рис. 22.3):
natsort()
void natsort(array array)
Функция natsort() правильно сортирует специальные символы. Мы видим, что ASCII-коды «а», «Ь» и «с» чудесно следуют друг за другом. Благодаря этому легко сравнивать и сортировать строки, но при добавлении и «а» им были отведены пустые места в таблице символов. Что еще хуже, они были размещены не в алфавитном порядке. Это послужило источником проблем на долгие годы, но сейчас поздно что-либо исправлять, поскольку исправление должно быть обратно совместимым со всем установленным программным обеспечением. Из-за того что написано много кода, обходящего эту проблему, мы столкнулись с довольно неприятной ситуацией. Об этом уроке необходимо помнить, сталкиваясь с новыми проблемами при языковых преобразованиях.
Еще более осложняет дело то, что во многих языках есть дополнительные правила, согласно которым некоторые символы сортируются иначе, будучи объединены вместе. В датском языке две соседние буквы «а» сортируются как один символ «а».
usort()
void usort(array array, string cmp_function)