为对数组中的数组进行排序的函数设置排序方向


Set sorting direction for a function that sorts arrays in an array

我有以下数组:

$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)。

谢谢!

在你的代码中添加两个可以修复这个问题:

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,这是人们所期望的。

我认为你可以为你的排序函数创建一个包装器:

asc_sorter = function(a, b) {
    return arraySorter(a, b);
}
desc_sorter = function(a, b) {
    return -arraySorter(a, b);
}
然后调用asc_或desc_ sorter

您可以接受一个可选的布尔值以降序排序,并将其默认为false。如果降序为true,则只需将retval乘以-1:

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;
  }

可以根据方向参数反转数组,如下所示:

 function sortArray($data, $field, $direction)
        /* sorting code */
        if($direction == 'DESC')
          return array_reverse($sorted_array);
        else 
          return $sorted_array;
      }