Update
我最近answered https://stackoverflow.com/questions/96759/how-do-i-sort-a-multidimensional-array-in-php/16788610#16788610在有关多维数组排序的“权威”主题中,以更有效的方式解决了这个问题。您可以安全地跳过阅读本答案的其余部分,并直接点击链接以获得更强大的解决方案。
原答案
功能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;
}
我忽略了这样一个事实:在您的示例中,生日的格式不能通过使用运算符进行简单比较来排序<
。在实践中,您首先将它们转换为简单可比较的格式。
Update:如果您认为维护一堆这些多标准比较器可能很快就会变得丑陋,那么您会发现我同意。但这个问题可以像计算机科学中的任何其他问题一样解决:只需添加另一个抽象级别即可。
我将假设 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'));
这个例子可能太聪明了;一般来说,我不喜欢使用不按名称接受参数的函数。但在这种情况下,使用场景是过于聪明的一个非常有力的论据。