2015-07-26 1 views
0

Я искал это, и похоже, что все это похоже на «обычай» на основе исходной структуры массива плаката.PHP Custom Sort Multi-Dimensional Array by DateTime Поле

Я изо всех сил пытаюсь получить массив, отсортированный по клавише [DateTime] каждой записи. Я бы хотел, чтобы они отсортировали Ascending (новейшее datetime с самым высоким индексом массива) и хотели бы сохранить структуру массива и ключи, если это возможно.

Array 
(
[0] => Array 
    (
     [Source] => SimpleXMLElement Object 
      (
       [0] => RTU-12 Merchandise Support, Fan Status Switch 
      ) 

     [EventType] => SimpleXMLElement Object 
      (
       [0] => Alarm Recall 
      ) 

     [Description] => SimpleXMLElement Object 
      (
       [0] => No Flow 
      ) 

     [DateTime] => 07-25-2015 20:09:47 
     [Priority] => SimpleXMLElement Object 
      (
       [0] => Medium 
      ) 

     [SubSystemKey] => SimpleXMLElement Object 
      (
       [0] => 2 
      ) 

     [ViewKey] => SimpleXMLElement Object 
      (
       [0] => 7 
      ) 

    ) 

[1] => Array 
    (
     [Source] => SimpleXMLElement Object 
      (
       [0] => RTU-03 Checkout Area, Fan Status Switch 
      ) 

     [EventType] => SimpleXMLElement Object 
      (
       [0] => Alarm Recall 
      ) 

     [Description] => SimpleXMLElement Object 
      (
       [0] => No Flow 
      ) 

     [DateTime] => 07-25-2015 20:09:44 
     [Priority] => SimpleXMLElement Object 
      (
       [0] => Medium 
      ) 

     [SubSystemKey] => SimpleXMLElement Object 
      (
       [0] => 2 
      ) 

     [ViewKey] => SimpleXMLElement Object 
      (
       [0] => 7 
      ) 

    ) 

... НЕКОТОРЫЕ ПОКАЗАТЕЛИ снимающие для удобочитаемости ...

[12] => Array 
    (
     [Source] => SimpleXMLElement Object 
      (
       [0] => ~RackA\SGr2\Cmp4, Proof of Running 
      ) 

     [EventType] => SimpleXMLElement Object 
      (
       [0] => Alarm Recall 
      ) 

     [Description] => SimpleXMLElement Object 
      (
       [0] => No Proof 
      ) 

     [DateTime] => 07-25-2015 19:39:13 
     [Priority] => SimpleXMLElement Object 
      (
       [0] => Medium 
      ) 

     [SubSystemKey] => SimpleXMLElement Object 
      (
       [0] => 1 
      ) 

     [ViewKey] => SimpleXMLElement Object 
      (
       [0] => 2 
      ) 

    ) 

[13] => Array 
    (
     [Source] => SimpleXMLElement Object 
      (
       [0] => ~RackC\SGr1, Suction Pressure 
      ) 

     [EventType] => SimpleXMLElement Object 
      (
       [0] => Alarm 
      ) 

     [Description] => SimpleXMLElement Object 
      (
       [0] => Pressure too high 
      ) 

     [DateTime] => 07-25-2015 19:14:21 
     [Priority] => SimpleXMLElement Object 
      (
       [0] => Medium 
      ) 

     [SubSystemKey] => SimpleXMLElement Object 
      (
       [0] => 1 
      ) 

     [ViewKey] => SimpleXMLElement Object 
      (
       [0] => 4 
      ) 

    ) 

[Count] => 14 
[NewEvents] => 14 
[Result] => Success 
) 

Вот что я пытался до сих пор:

function date_compare($a, $b) 
{ 
    $t1 = strtotime($a['DateTime']); 
    $t2 = strtotime($b['DateTime']); 
    return $t1 > $t2; 
}  

usort($alarms, 'date_compare'); 

Мои результаты просто несортированный (и казалось бы, сломанной организации). Я не слишком искусен с помощью usort, так что ищу некоторые рекомендации.

Спасибо!

ответ

1

кажется strtotime() не разобрать этот формат даты: 07-25-2015 19:39:13, что подтверждается некоторыми быстрых экспериментов:

var_dump(strtotime("07-25-2015 19:39:13")); 

BOOL (ложь)

var_dump(strtotime("07/25/2015 19:39:13")); 

ИНТ (1437845953)

Подробный список форматов дата используемых при strtotime() доступен здесь:
http://php.net/manual/en/datetime.formats.date.php

Самый быстрый способ решить это, чтобы преобразовать тир в слеш:

function date_compare($a, $b) { 
    $t1 = strtotime(str_replace('-', '/', $a['DateTime'])); 
    $t2 = strtotime(str_replace('-', '/', $b['DateTime'])); 
    return $t1 > $t2; 
} 

usort($alarms, 'date_compare'); 

Вы можете использовать uasort() для сохранения ключей вашего массива.
http://php.net/manual/en/function.uasort.php

рассмотреть Кроме того, это:

функция

Сравнение должна возвращать целое число меньшее, равное или больше нуля, если первый аргумент считается соответственно, меньше, равна или больше второго.

http://php.net/manual/en/function.usort.php

Поэтому:

function date_compare($a, $b) { 
    $t1 = strtotime(str_replace('-', '/', $a['DateTime'])); 
    $t2 = strtotime(str_replace('-', '/', $b['DateTime'])); 
    return $t1 > $t2 ? -1 : 1; 
} 

uasort($alarms, 'date_compare'); 
+0

Ах, даже не думал, отлаживать это. Это «работает» до сих пор, но, похоже, лишило мои ключевые имена из внешнего массива, поэтому я остался с: [0] => 14 [1] => 14 // Используется для произношения [NewEvents ] => 14 [16] => Успех // Используется, чтобы сказать [Результат] => Успех –

+0

Попробуйте 'uasort()' @SourceMatters – spenibus

+0

Это сделало трюк. Тем не менее, я все еще получаю странные результаты. Я пробовал возвращать $ t1 <$ t2; и возвратите $ t1> $ t2 ;. Когда я использую return $ t1> $ t2; и делаю print_r, он сначала печатает самые высокие индексы. Время сортируется, но «старое» дата-время - это индекс 13 (но сначала он печатает). Это вызывает проблемы, когда я перехожу к ним через цикл for позже. Это то, что я получаю: http://codepad.org/EFwjF3n9 –

 Смежные вопросы

  • Нет связанных вопросов^_^