Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为在数组中对数组进行排序的函数设置排序方向_Php_Arrays_Sorting_Closures - Fatal编程技术网

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

Php 为在数组中对数组进行排序的函数设置排序方向,php,arrays,sorting,closures,Php,Arrays,Sorting,Closures,我有以下数组: $data = array( array("firstname" => "Mary", "lastname" => "Johnson", "age" => 25), array("firstname" => "Amanda", "lastname" => "Miller", "age" => 18), array("firstname" => "James", "lastname" => "Brown", "

我有以下数组:

$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;
  }
它工作得很好,但我想知道如何更改它以传递第三个参数,sort direction(ASC或DESC)


谢谢大家!

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

asc_sorter = function(a, b) {
    return arraySorter(a, b);
}

desc_sorter = function(a, b) {
    return -arraySorter(a, b);
}

然后调用asc_uuu或desc_uuu分拣机

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

 function sortArray($data, $field, $direction)
        /* sorting code */

        if($direction == 'DESC')
          return array_reverse($sorted_array);
        else 
          return $sorted_array;
      }

在代码中添加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,这是您所期望的。

您可以采用可选的布尔值进行降序排序,并将其默认为
false
。如果降序为
,则只需将
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;
  }

你试过了吗?它应该像在函数声明中添加第三个参数一样简单,然后添加一些代码来使用array_reverse或类似的方法。您是否尝试过此方法并遇到问题?你能告诉我你想做什么吗?