За последние 24 часа нас посетили 16960 программистов и 1651 робот. Сейчас ищут 886 программистов ...

Сортировка многомерного массива

Тема в разделе "PHP для новичков", создана пользователем simple, 5 окт 2010.

  1. simple

    simple Активный пользователь

    С нами с:
    17 сен 2010
    Сообщения:
    56
    Симпатии:
    0
    Всем привет. Такая проблема, как отсортировать массив чтобы он сохранил всю последовательность элементов, какая было до сортировки. например файл:

    1;2;0
    4;5;0
    8;3;0
    7;6;0
    3;2;0

    вытаскиваем все это в массив сортируем с usort('пользовательская функия') по первым элементам, сортировка выходит, но нарушается связь последовательности какой они попадали в файл, т.е например если встречается два одинаковых превых эдементов то нужно чтобы тот элемент который попал в файл раньше был выше который попал в файл позже, вобщем примерно так, подскажите в каком направлении двигаться?
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Нифига не понятно, но возможно тебе поможет моя функция http://www.php.ru/forum/viewtopic.php?p=235784#235784 в ней порядок одинаковых элементов не должен нарушатсья (хотя какая разница, если они ОДИНАКОВЫЕ? o_0)
     
  3. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    добавить дополнительным элементом порядок следования и учитывать его при сортировке
     
  4. simple

    simple Активный пользователь

    С нами с:
    17 сен 2010
    Сообщения:
    56
    Симпатии:
    0
    Разные значения элементов сортируются правильно, по возрастанию или убыванию, а вот одинаковые по значению элементы нарушают тут связь по которой первоначально попали в файл, например первая запись файла, при наличии таких же одинаковых записей,в отсортированном массиве по своему значению будет например где нибудь по середине или даже в конце, хотя по идеи должна быть выше тех записей которые попали в файл позже.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    simple есть, simplest был, осталось только simplera дождаться...
     
  6. simple

    simple Активный пользователь

    С нами с:
    17 сен 2010
    Сообщения:
    56
    Симпатии:
    0
    а по теме не судьба высказаться?
     
  7. simple

    simple Активный пользователь

    С нами с:
    17 сен 2010
    Сообщения:
    56
    Симпатии:
    0
    вообщем разобрался я с этим вопросом, оказывается все решается очень просто =)
     
  8. simple

    simple Активный пользователь

    С нами с:
    17 сен 2010
    Сообщения:
    56
    Симпатии:
    0
    нет не разобрался, вообщем написал следующее
    PHP:
    1.  
    2. $a[0] = array(12565,0,1);
    3. $a[1] = array(12477,0,2);
    4. $a[2] = array(12843,0,3);
    5. $a[3] = array(12565,0,4);
    6. $a[4] = array(12305,0,5);
    7. $a[5] = array(12565,0,6);
    8. $a[6] = array(12305,0,7);
    9. $a[7] = array(12305,0,8);
    10. $a[8] = array(12565,0,9);
    11. $a[9] = array(12565,0,10);
    12. $a[10] = array(12477,0,11);
    13. $a[11] = array(12843,0,12);
    14. //.........................................
    15. $a[5000]=array(12567,0,5001);
    16. array_revers($a);
    17. for($i=0;$i<sizeof($a);$i++){
    18.  for($j=$i;$j<sizeof($a);$j++){
    19.   if($a[$i][0]>=$a[$j][0]){
    20.     $b[0]=$a[0+$i][0];
    21.     $b[1]=$a[0+$i][1];
    22.     $b[2]=$a[0+$i][2];
    23.     $a[0+$i][0]=$a[$j][0];
    24.     $a[0+$i][1]=$a[$j][1];
    25.     $a[0+$i][2]=$a[$j][2];
    26.     $a[$j][0]=$b[0];
    27.     $a[$j][1]=$b[1];
    28.     $a[$j][2]=$b[2];}}}
    29. for($i=0;$i<sizeof($a);$i++){
    30. echo $a[$i][0].' '.$a[$i][1].' '.$a[$i][2]."<br>";
    31. }
    32.  
    код работает как мне надо, сортирует одинаковые значения если они есть строго как они были упорядочены до сортировки, но очень медленно, 5000 записей сортирует 20 секунд, вероятно это из-за вложенных циклов for...как улучшить этот код?