Функция сортировки массива в PHP - PullRequest
0 голосов
/ 18 апреля 2011

Я определил myArr = ("Apr","Mar","May").Есть ли сортирующая функция для сортировки элементов массива по природе последовательности месяца, иначе по алфавиту.

Переменные членов массива могут быть изменены во время выполнения.

Я хочу, чтобы вывод выводился с последующим Март, апрель, май с использованием цикла foreach.

Ответы [ 3 ]

2 голосов
/ 18 апреля 2011

Вы можете использовать usort () и создать свою собственную функцию для сравнения месяцев.

function monthCompare($a, $b)
{
  $months = array('jan' => 1, 'feb' => 2..._);
  if($a == $b)
  {
    return 0;
  }
  return ($months[$a] > $months[$b]) ? 1 : -1;
}
1 голос
/ 18 апреля 2011

На основании ответа @ preinheimer, вот версия, которая будет выполнять последовательную сортировку, если имя не существует:

$data = array("Apr", "Mar", "Jan", "Feb", "ddd", "aaa", "ccc");

function monthCompare($a, $b) {
    $a = strtolower($a);
    $b = strtolower($b);
    $months = array(
        'jan' => 1,
        'feb' => 2,
        'mar' => 3,
        'apr' => 4,
        'may' => 5
    );
    if($a == $b)
        return 0;
    if(!isset($months[$a],$months[$b]))
        return $a > $b;
    return ($months[$a] > $months[$b]) ? 1 : -1;
}

usort($data, "monthCompare");

echo "<pre>";
print_r($data);

Возвращает:

Array
(
    [0] => aaa
    [1] => ccc
    [2] => ddd
    [3] => Jan
    [4] => Feb
    [5] => Mar
    [6] => Apr
)

Однако - это подчеркивает недостаток логики в вашем вопросе. Вы просили, чтобы он сортировался по последовательности месяц, иначе по алфавиту . Проблема в том, что вы недостаточно определили порядок сортировки таким образом, чтобы его можно было надежно тиражировать. Например, использование приведенного выше алгоритма и массива "ddd", "aaa", "ccc", "Apr", "Mar", "Jan", "Feb" (т. Е. Одинаковых элементов) дает результат:

Array
(
    [0] => aaa
    [1] => Jan
    [2] => Feb
    [3] => Mar
    [4] => Apr
    [5] => ccc
    [6] => ddd
)

Оба ответа верны в соответствии с вашим запросом, поэтому вам нужно более подробно определить требование сортировки.

0 голосов
/ 18 апреля 2011

Нет. нет такой функции. Но .... Вы все еще можете решить свою проблему изящно. Вы должны связать названия месяцев с числами (1 для января, 2 для февраля и т. Д.). Это самый распространенный подход в программировании.

Определите ваш массив как:

$myArr = array(1=>"Jan", 2=>"Feb" ... )

А затем вы можете отсортировать ваш $ myArr по ключам ( ksort ):

ksort($myArr);
var_export($myArr);

Это отсортировало бы ваш массив в порядке возрастания по ключам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...