Обновление
Я недавно ответил на этот вопрос гораздо более умелым способом в "окончательной" теме о сортировке многомерных массивов.Вы можете спокойно пропустить прочтение оставшейся части этого ответа и сразу перейти по ссылке, чтобы найти гораздо более подходящее решение.
Исходный ответ
Функция uasort
позволяет определить собственную функцию сравнения.Просто поместите в него все критерии, которые вы хотите.
Например, сортировать по дню рождения, а затем по имени:
function comparer($first, $second) {
// First see if birthdays differ
if ($first['birthday'] < $second['birthday']) {
return -1;
}
else if ($first['birthday'] > $second['birthday']) {
return 1;
}
// OK, birthdays are equal. What else?
if ($first['name'] < $second['name']) {
return -1;
}
else if ($first['name'] > $second['name']) {
return 1;
}
// No more sort criteria. The two elements are equal.
return 0;
}
Я игнорирую тот факт, что в вашем примере дни рожденияне в формате, который можно заказать простым сравнением с использованием оператора <
.На практике вы сначала конвертируете их в тривиально сопоставимый формат.
Обновление: Если вы считаете, что поддержание группы этих многокритериальных компараторов может быть ужасно быстрым, вы найдете меняв соглашении.Но эта проблема может быть решена как любая другая в компьютерной науке: просто добавьте еще один уровень абстракции.
Я буду использовать PHP 5.3 для следующего примера, чтобы использовать удобный синтаксис анон-функции.Но в принципе вы можете сделать то же самое с create_function
.
function make_comparer() {
$criteriaNames = func_get_args();
$comparer = function($first, $second) use ($criteriaNames) {
// Do we have anything to compare?
while(!empty($criteriaNames)) {
// What will we compare now?
$criterion = array_shift($criteriaNames);
// Do the actual comparison
if ($first[$criterion] < $second[$criterion]) {
return -1;
}
else if ($first[$criterion] > $second[$criterion]) {
return 1;
}
}
// Nothing more to compare with, so $first == $second
return 0;
};
return $comparer;
}
Затем вы можете сделать:
uasort($myArray, make_comparer('birthday', 'name'));
Этот пример, возможно, пытается быть слишком умным;в общем, я не люблю использовать функции, которые не принимают свои аргументы по имени.Но в этом случае сценарий использования является очень веским аргументом для того, чтобы быть слишком умным.