Сортировать многомерный массив по дочерней контрольной дате? - PullRequest
3 голосов
/ 25 апреля 2011

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

[0] => Array
        (
            [name] => The Name
            [description] => description
            [date] => Thur, May 5 @ 7:00 p.m.
            [rating] => PG
            [year] => 2011
        )

[1] => Array
        (
            [name] => Name 2
            [description] => description 2
            [date] => Sun, May 8 @ 7:30 p.m.
            [rating] => 14A
            [year] => 2011
        )

Есть еще около 5-10 частей.

В конечном итоге я хочу использовать часть массива date для группировки этих элементов по дням (т. Е. Все элементы с «date», попадающими в «May 8», должны быть сгруппированы как таковые).).

Любая идея, как мне поступить? Обратите внимание, что поле «дата» хранится как таковое в БД - это не метка времени, преобразованная из date (), или что-то подобное.

Большое спасибо!

Ответы [ 4 ]

7 голосов
/ 25 апреля 2011

Создайте свою собственную функцию сортировки и вызовите ее, используя usort .

Например (не учитывая сложности вашего формата отметки времени):

function date_sort($a, $b) {
  return strcmp($a['date'], $b['date']); //only doing string comparison
}

usort($array, 'date_sort');

Для завершенияdate_sort, вам нужно каким-то образом преобразовать даты в сопоставимые типы.Вот решение, которое преобразует их в метки времени UNIX:

function convert_date($time) {
  $time = substr($time, strpos($time, ',')+1);
  $time = str_replace('@', ',', $time);
  $time = str_replace('.', '', $time);
  return strtotime($time);
}

function date_sort($a, $b) {
  $a = convert_date($a['date']);
  $b = convert_date($b['date']);

  if ($a == $b) {
    return 0;
  }
  return ($a < $b) ? -1 : 1;
}
2 голосов
/ 25 апреля 2011

Используйте решение @Emil Vikström с strtotime в качестве функции сравнения

function date_sort ($ a, $ b) {

$ a = strtotime ($ a ['date']);$ b = strtotime ($ b ['date']);

return ($ a == $ b)?0: ($ a> $ b? - 1: 1);

}

usort ($ array, 'date_sort');

http://fr2.php.net/manual/en/function.strtotime.phpдолжен иметь дело с большинством текстовых дат, написанных на английском языке.

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

Попробуйте это

$ arrArray имеет указанный вами массив;

$newArray = array();
foreach($arrArray as $key => $value){

    $date1 = substr($value['date'], 0, strpos($value['date'],'@')-1);
    $newArray[$date1][] = $value;


}
print_r($newArray);
0 голосов
/ 25 апреля 2011

Для группировки ваших данных по дате, запустите этот маленький цикл

$sortedArray = array();
foreach($dataListing as $data){
     //parse your $date field with an reg exp and transform it into integer with format MMDD
     $sortedArray[$dateIntegerFormated][] = $data;
}
ksort($sortedArray);
$sortedArray = array_values($sortedArray);

И вы можете использовать usort для сортировки по времени в каждой группе

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