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


Функция usortO помогает писать собственные функции сортировки, array - это сортируемый массив, a cmp_functior - имя функции, посредством кото­рой надо сравнивать два элемента массива. Нам требуется написать только функцию сортировки, а собственно сортировку символов выполнит РНР.

Функция сравнения должна принимать два аргумента и возвращать целое число - отрицательное, ноль или положительное, если первый аргумент со­ответственно меньше второго, равен ему или больше него.

В качестве функции сравнения можно взять встроенную функцию РНР или написать свою. Используя st гс-о 11 (), мы устанавливаем правильную локаль, а затем вызываем usort():

setlocale(LC_TIME, 'da_DK'); usort($array,

Функция включена в РНР с версии 4.0.5. Ее достоинство в том, что

она учитывает все, что системной локали известно о языке. Следовательно, она знает и о тех по которым два символа должны сортироваться

как один самостоятельный.

Пользовательская функция сравнения

Функция О доступна в РНР начиная с версии 4.0.5, но мы можем на­

писать собственную функцию сравнения.

Наша функция будет правильно сортировать три специальных символа дат­ского языка. Функция не будет рассматривать как «а», потому что это слишком усложнило бы ее и лишило поучительности. Функция начинает работу, проверяя, действительно ли оба аргумента являются строками. Если это не так, сравниваем аргументы, как это сделал бы РНР, если бы мы вызы­вали функцию

function daCmp($a, $b)

.

Числа и т. */ if (!is_string($a) [i lis string($b)) {

if ($a < $b) {

return } elseif ($a == $b) { return 0;

} else return

}

При сортировке символов датского языка мы не делаем различия между буквами верхнего и нижнего регистров, поэтому преобразуем обе строки к нижнему регистру и сравним их:

$а = strtolower($a); $b = strtolower(Sb);

// Равные элементы, if ($a == $b) return 0;

Затем мы просматриваем строки, пока не найдем в них два отличающихся символа. Результат сравнения этих двух символов определит порядок двух элементов в массиве. Счетчик $i указывает на место, в котором различаются строки, поэтому сравнивать надо $a[$i] и $b[$i]:

$i = 0;

while($a[$i] == $b[$i]) {

J

Последняя буква «ж» нужна для того, чтобы поймать «ж». Если ее опустить, strrpos() возвратит 0, что неверно, даже если буква найдена:

$speciai_chars = 'геоёээ';

Двумерный массив, который следует далее, используется для выяснения от­носительного порядка специальных символов. Во внешнем массиве есть эле­менты для каждого специального символа. Это символ, находящийся в пер­вом аргументе, $а. Каждый элемент является массивом, содержащим те же самые специальные символы. Этот внутренний массив - символ, находя­щийся во втором аргументе, $Ь.