Установить направление сортировки для функции, которая сортирует массивы в массиве

У меня есть следующий массив:

$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