按子键日期对多维数组进行排序?

3

我有以下数组:

[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个部分。

我最终想做的是使用数组中的日期部分按日分组这些项(例如,“所有日期为“ 5月8日”的项目应该被归为一组)。

你有什么想法吗?请注意,“日期”字段在数据库中存储为此,而不是从date();或其他方式转换的时间戳。

非常感谢!

4个回答

7

创建自己的排序函数并使用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;
}

这个完全有效;非常感谢!话虽如此——我仍然遇到了一个问题。在上面的例子中,我只是为数组键(即第一个元素)提供了一个数字,但实际上,数组键是文章的slug(即一个随机字符串)。运行usort后,数组键被转换为数字。有什么办法可以避免这种情况? - aendra
1
没关系!在 usort() 的地方使用 uasort() 就解决了。谢谢,并对接受我的答案有所延迟表示歉意! - aendra

2
使用@Emil Vikström的解决方案,以strtotime作为比较函数。
函数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可以处理大多数用英语书写的文本日期。


strtotime无法处理这种格式,但我已经更新了我的答案,并提供了一个函数,将原始格式转换为strtotime可以理解的格式。 - Emil Vikström

0

如果想按日期对数据进行分组,请运行以下代码:

$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按时间对每个组进行排序


0

试试这个

$arrArray 包含你指定的数组;

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

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


}
print_r($newArray);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接