Ошибка при сортировке массива.

[SDem]

Новичок
Ошибка при сортировке массива.

Имеется массив состояший из слов в различном порядке.Члены массива,то есть слова надо сортировать по алфавиту.Делаю это с помощью sort.В полученном массиве элементы идут по возрастанию т.е. по идее от а до я,но почемуто возникает ошибка в сортировке и РНР ставит на первое место "ё"и"е" а потом уже всё остальное по алфавиту.Думал какая то ошибка в кодировке,но пробовал скопировать скрипт на сервак AGAVA- тот же результат.Вообще если попробовать сравнить например "а" и "ё", то ё<а.Как с этим бороться????
 
Напиши свою функцию сортировки, гдесравнивай как хочешь, хоть русские и английские буквы, и используй usort..

----------------------
void usort (array array, string cmp_function)

Эта функция отсортирует массив по значениям с помощью пользовательской функции сравнения. Если вам нужно нетривиально отсортировать массив, используйте её.

Пример 1. usort()
PHP:
function cmp ($a, $b) {
    if ($a == $b) return 0;
    return ($a > $b) ? -1 : 1;
}

$a = array (3, 2, 5, 6, 1);

usort ($a, "cmp");

while (list ($key, $value) = each ($a)) {
    echo "$key: $value\n";
}
---------------------
 

Winer

Мимо проходил
может лучше разобратся с локалью попробовать сначала ???
[m]setlocale[/m] + поиск по форуму
а usort достаточно медленная функция, и пользоватся ей стоит. ИМХО, только в крайнем случае, только если других выходов нет, либо они медленне usort.
 

[SDem]

Новичок
USORT

К сожалению с локалью не получилось,а с USORT я что то не пойму как сделать.Как вообще применить это к моему случаю.Я тут книжку почитал про эту функцию,как я понял она сравнивает 2 соседних элемента массива по какому либо алгоритму,а как у меня то это будет смотреться?
 

Winer

Мимо проходил
а ты попробуй написать, если не будет работать как нужно, покажешь.
 

IL78

Guest
Вот убогий вариант, сравнивающий исключительно по первым буквам:
PHP:
function RusSort($word1,$word2) {
	$rus_abc = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя";
	if (strpos($rus_abc,$word1{0}) == strpos($rus_abc,$word2{0})) return 0;
	else return (strpos($rus_abc,$word1{0}) > strpos($rus_abc,$word2{0})) ? 1 : -1;
}

usort ($a, "RusSort");
P.S. $word1{0} это сокращенная запись substr($word1,0,1) - я сам это только что узнал :)

P.P.S. ИМХО, все же нужно добиваться толку от локали...
 

[SDem]

Новичок
USORT

Так яж говорю,я вообще не представляю как использовать это в моём случае,подскажите хоть на словах без кода,что примерно должно осуществляться в управляющей фйнкции для такого процесса.
 
All
Я понял в чем ошибка - оно и не будет работать....
В общем, дело в том, что код символа "ё" очень сильно отличается от кода других символов, наверное не совсем понятно, вот пример...
Если код символа "а" = 20, то код символа "б"=21, и так далее, так вот, дело в том, что "ё" будет равно, например 15....

И, как мне кажется, стандартная функция сравнения просто берет эти коды и сравнивает их, как в с++....

Так что, ИМХО, если сильно нужно все отсортировать - используй свою функцию....
 

IL78

Guest
Loshadka
ИМХО при правильно настроенной локали на эти вещи делаются соответствующие поправки и все должно быть путем)
 
IL78
Не уверен, ведь SDem сказал, что
-------------------
Вообще если попробовать сравнить например "а" и "ё", то ё<а.Как с этим бороться????
-------------------
 

IL78

Guest
Loshadka,
Значит, у него локаль установлена неправильно (опять же, имхо). А механизм проблемы ты в общих чертах правильно обрисовал.
 

[SDem]

Новичок
Всем сенкс:)

Всем спасибо огромное за помощь.особенно
IL78 .Попробую его функцию или сделаю что нибудь своё,если придумаю умнее конечно.Спасибо!!!
 

Profic

just Profic (PHP5 BetaTeam)
[SDem]
Какая нах ф-ция.
А ну быстро в поиск по форуму на предмет setlocale и искать мой пост. Там есть все, что тебе нужно
 

[SDem]

Новичок
Яж говорю что с локалью я пробовал уже-ноль эффекта.Я делал так
setlocale (LC_COLLATE, ''ru_RU.CP1251'');Но последовал твоему совету,поискал твои посты,нашол вот что:
// локаль
$locale = 'ru_RU.CP1251'; // системная локаль
setlocale (LC_COLLATE, ''); //установка локали (системная для Windows и из переменной окружения "LANG" для Unix
setlocale (LC_CTYPE, '');
setlocale (LC_TIME, '');


и ещё в раз ты написал вместо второй строки такую
$config['lc.locale'] = "ru_RU.CP1251"; // системная локаль
что впринципе ничего не изменило,эффект по прежнему тот же,тоесть нулевой:-(
 
Сверху