Задайте посока на сортиране за функция, която сортира масиви в масив

Имам следния масив:

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

Благодаря ти!


person Psyche    schedule 07.06.2013    source източник
comment
Опита ли? Трябва да е толкова просто, колкото добавянето на третия аргумент към декларацията на функцията, след което добавяне на някакъв код за използване на array_reverse или подобен.   -  person Jessica    schedule 07.06.2013
comment
Това би изглеждало доста тривиално. Опитвали ли сте това и срещате ли проблеми? Можете ли да покажете какво се опитахте да направите?   -  person Mike Brant    schedule 07.06.2013


Отговори (4)


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, което е това, което човек би очаквал.

person dudewad    schedule 07.06.2013

Мисля, че можете да създадете обвивка за вашата функция за сортиране:

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

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

И след това извикайте asc_ или desc_ сортировач

person mishik    schedule 07.06.2013

Можете да вземете незадължително булево значение за сортиране в низходящ ред и да го зададете по подразбиране на 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;
  }
person Paul    schedule 07.06.2013

Можете просто да обърнете масива в зависимост от параметъра на посоката така:

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

        if($direction == 'DESC')
          return array_reverse($sorted_array);
        else 
          return $sorted_array;
      }
person BIOS    schedule 07.06.2013