Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Затруднения с сортировкой

Сообщения:  [1-5] 

 
 автор: Loki   (09.03.2006 в 16:25)   письмо автору
 
   для: Shorr Kan   (09.03.2006 в 16:14)
 

а попробуйте данные "насильно" привести к числовому типу: сейчас сравниваются строки.

   
 
 автор: Shorr Kan   (09.03.2006 в 16:14)   письмо автору
 
   для: Shorr Kan   (09.03.2006 в 14:06)
 

Понятно. Не хватало обрезания пробелов в конце. Работает, спасибо.

   
 
 автор: Shorr Kan   (09.03.2006 в 14:06)   письмо автору
 
   для: Temnovit   (09.03.2006 в 11:58)
 

Вроде бы сработало, но она отсортировала так:

0
1
1
113
2
21
24
3

Т.е., только по первому символу...

   
 
 автор: Temnovit   (09.03.2006 в 11:58)   письмо автору
 
   для: Shorr Kan   (09.03.2006 в 10:48)
 

Есть функция uasort() которая способна Вам помочь! Смысл функции в том, что вы сами пишите функцию сравнения для сортировки и тем самым можите сортировать сложные структуры по разным критериям.

Делаеться это так. Сначала нужно написать функцию которая будет сравнивать Ваши две строки так, как вам этого хочеться (Например по третьему числу). Если результат "больше", функция должна вернуть 1, если "меньше", то -1. Ну а если "равно" то соответственно 0. В вашем случае это будет выглядить так:

<?
// $str1, $str2 - сравниваемые строки
// $n - номер елемента покоторому произойдет сортировка (нач. с нуля)
function cmp_func($str1$str2$n) {
   
$n 3;
   
// разбиваем строку, передавая еечасти разделенные *  в массив
   
$arr1 explode("*"$str1);
   
$arr2 explode("*"$str2);

   
//ну а теперь сравниваем
  
if ( $arr1[$n] >  $arr2[$n] ) return 1;
  if ( 
$arr1[$n] == $arr2[$n] ) return 0;
  if ( 
$arr1[$n] <  $arr2[$n] ) return -1;
}
?>


Теперь можно приступать к сортировке.

<?
 
/*$fstr - предположим в эту строку вы считали из файла 
   и она содержит что то вроде
  1*8*5*9
  2*3*7*3
  3*7*0*1
 */
  
$arr explode("\n"$fstr);
  
uasort($arr"cmp_func");
/* в результате в массиве $arr окажуться строки в таком порядке:
      3*7*0*1
      1*8*5*9
      2*3*7*3
    Внимание! Индексы массива не меняються, а лишь меняется порядок элементов!
*/
?>

   
 
 автор: Shorr Kan   (09.03.2006 в 10:48)   письмо автору
 
 

Есть файл:

1*8*5*9
2*3*7*3
3*7*0*1

Если я хочу отсортировать по третьему столбу, то должен получить:

3*7*0*1
1*8*5*9
2*3*7*3

Если по второму:

2*3*7*3
3*7*0*1
1*8*5*9


Иными словами - соответствия строк должны сохраняться. Как это делается?

   

Сообщения:  [1-5] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования