За последние 24 часа нас посетили 63176 программистов и 1742 робота. Сейчас ищут 1055 программистов ...

Сортировка массива

Тема в разделе "Вопросы от блондинок", создана пользователем Mat, 26 май 2010.

  1. Mat

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

    С нами с:
    12 дек 2006
    Сообщения:
    391
    Симпатии:
    0
    Всем привет! Не хотелось бы велосипед придумывать, решил поинтересоваться как лучше(быстрее) реализовать?... есть массив:
    HTML:
    1. Array
    2. (
    3.      [0] => Array
    4.          (
    5.               [year] => 2010
    6.               [month] => 11
    7.               [day] => 1
    8.               [time] => 18:40
    9.          )
    10.  
    11.      [1] => Array
    12.          (
    13.               [year] => 2009
    14.               [month] => 10
    15.               [day] => 12
    16.               [time] => 16:40
    17.          )
    18.  
    19.      [2] => Array
    20.          (
    21.               [year] => 2010
    22.               [month] => 11
    23.               [day] => 10
    24.               [time] => 13:40
    25.          )
    26. )
    И собственно нужно привести его к виду:

    HTML:
    1. Array
    2. (
    3.      [0] => Array
    4.          (
    5.               [year] => 2010
    6.               [month] => 11
    7.               [day] => 10
    8.               [time] => 13:40
    9.          )
    10.  
    11.      [1] => Array
    12.          (
    13.               [year] => 2010
    14.               [month] => 11
    15.               [day] => 1
    16.               [time] => 18:40
    17.          )
    18.  
    19.      [2] => Array
    20.          (
    21.              [year] => 2009
    22.              [month] => 10
    23.              [day] => 12
    24.              [time] => 16:40
    25.          )
    26. )
     
  2. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    http://ru.php.net/manual/en/function.usort.php
    В пользовательской функции я бы из значений массива генерил бы таймстамп чем-то вроде mktime или strtotime, а его уже банально сравнивал как в примерах usort. Ух, кстати, как встроенной перловой <=> не хватает в таких случаях...
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если все массивы склеить в строчки, то они быстренько сортирнутся :D
     
  4. Mat

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

    С нами с:
    12 дек 2006
    Сообщения:
    391
    Симпатии:
    0
    Работает Однако! Спасибо MiksIr!

    PHP:
    1. $mass[0]['year'] = '2010';
    2. $mass[0]['month'] = '12';
    3. $mass[0]['day'] = '1';
    4. $mass[0]['time'] = '15:40';
    5.                                                        
    6. $mass[1]['year'] = '2009';
    7. $mass[1]['month'] = '11';
    8. $mass[1]['day'] = '12';
    9. $mass[1]['time'] = '16:40';
    10.                                                        
    11. $mass[2]['year'] = '2010';
    12. $mass[2]['month'] = '10';
    13. $mass[2]['day'] = '10';
    14. $mass[2]['time'] = '18:40';
    15.                                                        
    16. $mass[3]['year'] = '2010';
    17. $mass[3]['month'] = '12';
    18. $mass[3]['day'] = '2';
    19. $mass[3]['time'] = '10:40';
    20.                                                        
    21. $mass[4]['year'] = '2009';
    22. $mass[4]['month'] = '11';
    23. $mass[4]['day'] = '11';
    24. $mass[4]['time'] = '16:41';
    25.                                                        
    26. echo '<pre>'; print_r($mass); echo '</pre>';
    27.                                                        
    28. echo '---<br/>';
    29.                                                        
    30. function test_m($i, $t)
    31. {
    32.     if ($t == $i) {return 0;}
    33.     return ($t < $i) ? -1 : 1;                                                          
    34. }
    35.                                                        
    36. usort($mass, 'test_m');
    37.                                                        
    38. echo '<pre>'; print_r($mass); echo '</pre>';
     
  5. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Если сравниваешь тупо массивы, следи, что бы время было с нулем, т.е. 01:20, а не 1:20, так как во втором случае сравнение будет ошибочным.
     
  6. Mat

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

    С нами с:
    12 дек 2006
    Сообщения:
    391
    Симпатии:
    0
    Да, я это предусмотрел ещё давно, time беру из БДе в формате 00:00:00, вобщем как то так...
     
  7. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    а отсортировать прямо в запросе никак?
     
  8. Mat

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

    С нами с:
    12 дек 2006
    Сообщения:
    391
    Симпатии:
    0
    Да, можно, правда у меня ничего не вышло с первого раза... я не стал пока над этим голову ломать и усложнять зарос, хотя надо бы. Тогда к примеру табличка: [sql]
    --
    -- Структура таблицы `test`
    --

    CREATE TABLE `test` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `user_id` int(10) unsigned NOT NULL,
    `date_create` timestamp NOT NULL default CURRENT_TIMESTAMP,
    `date_start` date NOT NULL,
    `time` time default NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=8 ;

    --
    -- Дамп данных таблицы `test`
    --

    INSERT INTO `test` VALUES(1, 1, '2010-05-27 09:21:45', '2010-05-27', '12:30:00');
    INSERT INTO `test` VALUES(2, 1, '2010-05-27 09:21:45', '2010-05-28', '12:00:00');
    INSERT INTO `test` VALUES(3, 2, '2010-05-27 09:21:45', '2010-05-27', '12:00:00');
    INSERT INTO `test` VALUES(4, 2, '2010-05-27 09:21:45', '2010-05-27', '12:40:00');
    INSERT INTO `test` VALUES(5, 1, '2010-05-27 09:21:45', '2010-05-29', '11:00:00');
    INSERT INTO `test` VALUES(6, 1, '2010-05-27 09:24:25', '2010-05-27', '13:00:00');
    INSERT INTO `test` VALUES(7, 1, '2010-05-27 09:24:25', '2010-05-28', '14:00:00');[/sql]
    Пока я остановился только на:[sql]SELECT `id`, `date_start`, `time` FROM `test` WHERE `user_id` = '1' ORDER BY `date_start` DESC LIMIT 10[/sql]
    Как мне сделать ORDER BY, так чтобы ещё и время цеплялось, я не придумал пока... может ты подскажешь пример подобных запросов?
     
  9. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    через запятую
     
  10. Mat

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

    С нами с:
    12 дек 2006
    Сообщения:
    391
    Симпатии:
    0
    о! Вот так работает!
    [sql]SELECT `id`, `date_start`, `time` FROM `test` WHERE `user_id` = '1' ORDER BY `date_start` DESC, `time` DESC[/sql]
    Надо переместить к блондинкам =))