2012-06-01 3 views
0

У меня есть таблица/массив. Например. в Excel я могу сортировать по столбцу 1 по возрастанию, столбец 2 по убыванию, столбец 3 по возрастанию и т. д.Сортировка массива несколькими ключами в PHP

Могу ли я сделать то же самое в PHP? Сначала с ["first_name"] ASC, затем ["last_name"] DESC, ["player_id"] ASC и ["user_id"] DESC.

array(2) { 
    [0]=> array(6) { 
     [0]=> string(8) "John", 
     ["first_name"]=> string(8) "John", 
     [1]=> int(7) "44", 
     ["score"]=> int(7) "44", 
     [2]=> string(2) "7", 
     ["player_id"]=> string(2) "7", 
     [3]=> string(2) "3", 
     ["user_id"]=> string(2) "3" 
    }, 
    [1]=> array(6) { 
     [0]=> string(5) "Sam", 
     ["first_name"]=> string(5) "Sam", 
     [1]=> int(7) "55", 
     ["score"]=> int(7) "55", 
     [2]=> string(2) "1", 
     ["player_id"]=> string(2) "1", 
     [3]=> string(2) "6", 
     ["user_id"]=> string(2) "61" 
    } 
} 

(массив гораздо больше и глубже в самом деле, это всего лишь пример.)

Update:

function byPlayerID($player, $compare) { 
    if($player['player_id'] > $compare['player_id']) 
     return 1; // move up 
    else if($player['player_id'] < $compare['player_id']) 
     return -1; // move down 
    else 
     return 0; // do nothing 

    if($player['score'] > $compare['score']) 
     return 1; // move up 
    else if($player['score'] < $compare['score']) 
     return -1; // move down 
    else 
     return 0; // do nothing 
} 

Update 2: Ничего, я просто нужно удалить return 0;

ответ

1

Использование usort().

Пример:

$byPlayerID = function($player, $compare) { 
    if($player['player_id'] > $compare['player_id']) 
    return 1; // move up 
    else if($player['player_id'] < $compare['player_id']) 
    return -1; // move down 
    else 
    return 0; // do nothing 
}; 

usort($players, $byPlayerID); 
// now $players is sorted! 

Это требует PHP 5.3, хотя, ниже более обратную совместимость версии

function byPlayerID($player, $compare) { 
    if($player['player_id'] > $compare['player_id']) 
    return 1; // move up 
    else if($player['player_id'] < $compare['player_id']) 
    return -1; // move down 
    else 
    return 0; // do nothing 
} 

usort($players, "byPlayerID"); 
+0

Я знаю о usort(), просто не могу понять, как использовать его в этом конкретном случае. – redacted

+0

Помните, что вы извлекаете массивы, если вы используете usort в многомерном контексте. Это сложная концепция для захвата и визуализации. В руководстве [usort] (http://se.php.net/manual/en/function.usort.php)() есть несколько отличных примеров. – nyson

+0

@redacted, приведенный выше пример берет массив в формате, который вы указали, в соответствии с идентификатором игрока. – nyson

0

Используйте функцию PHP , чтобы сравнить значения по мере необходимости. Расширьте функцию обратного вызова, чтобы сравнить несколько значений.

+0

Я знаю о usort(), просто не могу понять, как использовать его в данном конкретном случае. – redacted

+0

nyson уже запустил решение для вас. Просто добавьте больше, если ... else петли. – Paul

4

array_multisort это функция, которую вы ищете.

А вот пример функции, написанные с использованием array_multisort

https://gist.github.com/1220785

с использованием

$sorted_arraty = sort_array_multidim($array,"first_name ASC, last_name DESC, player_id ASC, user_id DESC"); 
0

Для тех, кто находит это в будущем, вот окончательный рабочий вариант, который полностью отвечает на исходный вопрос , Это сортируется по четырем ключевым значениям.

$byPlayerID = function($a, $b) { 

    // Sort by first 
    // > to return 1, < to return -1 = ASC order 
    if($a['first_name'] > $b['first_name']) return 1; // move up 
    else if($a['first_name'] < $b['first_name']) return -1; // move down 

    // Sort by second 
    // < to return 1, > to return -1 = DESC order 
    if($a['last_name'] < $b['last_name']) return 1; // move up 
    else if($a['last_name'] > $b['last_name']) return -1; // move down 

    // Sort by third 
    // > to return 1, < to return -1 = ASC order 
    if($a['player_id'] > $b['player_id']) return 1; // move up 
    else if($a['player_id'] < $b['player_id']) return -1; // move down 

    // Sort by fourth 
    // < to return 1, > to return -1 = DESC order 
    if($a['user_id'] < $b['user_id']) return 1; // move up 
    else if($a['user_id'] > $b['user_id']) return -1; // move down 

    else return 0; // do nothing 

}; 

usort($stats, $byPlayerID); 
Смежные вопросы