我有以下数组:
$data = array(
array("firstname" => "Mary", "lastname" => "Johnson", "age" => 25),
array("firstname" => "Amanda", "lastname" => "Miller", "age" => 18),
array("firstname" => "James", "lastname" => "Brown", "age" => 31),
array("firstname" => "Patricia", "lastname" => "Williams", "age" => 7),
array("firstname" => "Michael", "lastname" => "Davis", "age" => 43),
array("firstname" => "Sarah", "lastname" => "Miller", "age" => 24),
array("firstname" => "Patrick", "lastname" => "Miller", "age" => 27)
);
以下排序功能:
function sortArray($data, $field)
{
if(!is_array($field)) $field = array($field);
usort($data, function($a, $b) use($field) {
$retval = 0;
foreach($field as $fieldname) {
if($retval == 0) $retval = strnatcmp($a[$fieldname],$b[$fieldname]);
}
return $retval;
});
return $data;
}
它工作得很好,但我想知道如何更改它以传递第三个参数,排序方向(ASC或DESC)。
谢谢!
答案 0 :(得分:2)
添加2个代码可以解决这个问题:
function sortArray($data, $field, $dir = "asc")
{
//All your sorting code
//Then:
return strtolower($dir) == "asc" ? $data: array_reverse($data);
}
这简单地反转数组,并在将任何内容传递给非“asc”的第三个参数时以此方式返回。 strtolower()允许你接受任何情况(“asc”,“ASC”,“Asc”等),所以你不必记住,它默认为ASC,这是人们所期望的。
答案 1 :(得分:1)
我认为你可以为你的排序功能创建一个包装器:
asc_sorter = function(a, b) {
return arraySorter(a, b);
}
desc_sorter = function(a, b) {
return -arraySorter(a, b);
}
然后调用asc_或desc_ sorter
答案 2 :(得分:0)
您可以接受一个可选的布尔值,以降序排序,默认为false
。如果降序为retval
,则只需将-1
乘以true
:
function sortArray($data, $field, $descending = false)
{
if(!is_array($field)) $field = array($field);
usort($data, function($a, $b) use($field) {
$retval = 0;
foreach($field as $fieldname) {
if($retval == 0) $retval = strnatcmp($a[$fieldname],$b[$fieldname]);
}
return ($descending ? -1 : 1)*$retval;
});
return $data;
}
答案 3 :(得分:-1)
您可以根据方向参数反转数组,如下所示:
function sortArray($data, $field, $direction)
/* sorting code */
if($direction == 'DESC')
return array_reverse($sorted_array);
else
return $sorted_array;
}