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


// Один пробел между суммой и знаком. "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)