2010-04-20 80 views
2

我有一个数组,我想使用MySQL数据库中的日期字段进行排序。PHP通过mysql排序数组日期

这是这是在我的类名为news阵列的样本:

[48] => Array 
    (
     [id] => 14 
     [type] => 3 
     [updated] => 2010-04-17 13:54:42 
    ) 

[49] => Array 
    (
     [id] => 15 
     [type] => 3 
     [updated] => 2010-04-17 13:57:21 
    ) 

我想通过updated字段进行排序。

我有一些我已经开始的代码,但我不确定如何完成它并让它工作。

class ProcessClass { 
    // .... 
    function sortNews($x) 
    { 
    usort($this->news, array("ProcessClass", "cmp")); //correct sort type? 
    } 

    function cmp($a, $b) 
    { 
    // missing code 
    } 

任何人都可以帮忙吗?

+1

为什么不能在MySQL中已经进行排序? – 2010-04-20 17:33:44

+0

你不能排序在MySQL方面? – hsz 2010-04-20 17:35:20

+0

对不起,我应该说,该数组是从大约5个不同的SQL select查询构建而成的,这些查询在各种情况下有所不同,因此无法加入。 – daviemanchester 2010-04-20 17:45:44

回答

9

在大多数情况下,会比较容易添加ORDER BY updated到SQL查询的末尾,但是如果您的数据是从多个来源,你需要在PHP中的度假胜地,你可以使用usort()排序依据的阵列用户定义的功能。要使用类功能进行比较,功能必须为为静态。

class ProcessClass { 
    // this must be static 
    static function sort_by_updated($a, $b) 
    { 
    return strcmp($a['updated'], $b['updated']); 
    } 

    function sortNews() 
    { 
    usort($this->news, array("ProcessClass", "sort_by_updated")); 
    } 

如果要反转排序顺序,只需简单更换比较PARAMS:它可以使用这恰好返回正是你需要通过一个MySQL格式的日期排序什么功能strcmp()阵列中只比较updated值:return strcmp($b['updated'], $a['updated'])

+2

同意,让数据库进行排序,这是数据库的好处。 – ilikeorangutans 2010-04-20 17:38:14

+0

对不起,我应该说,该数组是从大约5个不同的SQL select查询构建而成的,这些查询在各种情况下有所不同,因此无法加入。 – daviemanchester 2010-04-20 17:44:05

+0

非常感谢! – daviemanchester 2010-04-20 20:23:57

0

如果你真的需要使用PHP排序,你可以去执行一个usort()

<?php 
function mysql_datesort($a, $b) 
{ 
    if ($a == $b) { 
     return 0; 
    } 

    return ($a->date_field < $b->date_field) ? -1 : 1; //custom check here 
} 

$a = array(); //your PHP array here... 

usort($a, "mysql_datesort"); 

?> 
+0

感谢您的帮助。 – daviemanchester 2010-04-20 20:24:26

1

通过指定MySQL的时间字段和顺序排序记录/ assoc_arrays的数组:

function build_sorter($key, $dir='ASC') { 
     return function ($a, $b) use ($key, $dir) { 
      $t1=strtotime(is_array($a)?$a[$key]:$a->$key); 
      $t2=strtotime(is_array($b)?$b[$key]:$b->$key); 
      if($t1==$t2) return 0; 
      return (str_to_upper($dir)=='ASC'?($t1 < $t2):($t1 > $t2)) ? -1 : 1; 
     }; 
    } 


    // $sort - key or property name 
    // $dir - ASC/DESC sort order or empty 
    usort($arr, build_sorter($sort, $dir));