За последние 24 часа нас посетил 22791 программист и 1262 робота. Сейчас ищут 728 программистов ...

Сортировка двумерного массива по X (как таблицы по столбцу)

Тема в разделе "Решения, алгоритмы", создана пользователем [vs], 27 фев 2011.

  1. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Часто стал подниматься вопрос, и раз это всем помагает, сделаю в отдельной теме
    Код (PHP):
    1. <?php
    2. function order($array, $by) {
    3.     $result = array();
    4.     foreach ($array as $val) {
    5.         if (!is_array($val) || !key_exists($by, $val)) {
    6.             continue;
    7.         }
    8.         end($result);
    9.         $current = current($result);
    10.         while ($current[$by] > $val[$by]) {
    11.             $result[key($result)+1] = $current;
    12.             prev($result);
    13.             $current = current($result);
    14.         }
    15.         $result[key($result)+1] = $val;
    16.     }
    17.     return $result;
    18. }
    19. // Отсортировать по стобцу score
    20. $rating = array(
    21.     array('name'=>'Vasya', 'score'=>152),
    22.     array('name'=>'Igor',  'score'=>73),
    23.     array('name'=>'Kolya', 'score'=>312),
    24.     array('name'=>'Pavel', 'score'=>100),
    25.     array('name'=>'Roman', 'score'=>429),
    26.     array('name'=>'Alex',  'score'=>56)
    27. );
    28. print_r(order($rating, 'score'));
    29.  
    Это не самый быстрый вариант. Можно как сделать стандартными функциями сортировки, но не проверялось, как будет быстрее. На это решение пока никто не жаловался :)
     
  2. Frozen

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

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1.  
    2. // Отсортировать по стобцу score
    3.  $rating = array(
    4.      array('name'=>'Vasya', 'score'=>152),
    5.      array('name'=>'Igor',  'score'=>73),
    6.      array('name'=>'Kolya', 'score'=>312),
    7.      array('name'=>'Pavel', 'score'=>100),
    8.      array('name'=>'Roman', 'score'=>429),
    9.      array('name'=>'Alex',  'score'=>56)
    10.  );
    11.  
    12. $by = 'score';
    13. usort($rating, function($first, $second) use( $by  ) {
    14.     if ($first[$by]>$second[$by]) { return 1; }
    15.     elseif ($first[$by]<$second[$by]) { return -1; }
    16.     return 0;
    17. });
    18. print_r($rating);
    19.  
     
  3. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Frozen
    PHP 5.3 style =)