PHP按包含日期的元素对多维数组进行排序

我有一个数组如:

Array ( [0] => Array ( [id] => 2 [type] => comment [text] => hey [datetime] => 2010-05-15 11:29:45 ) [1] => Array ( [id] => 3 [type] => status [text] => oi [datetime] => 2010-05-26 15:59:53 ) [2] => Array ( [id] => 4 [type] => status [text] => yeww [datetime] => 2010-05-26 16:04:24 ) ) 

任何人都可以建议一种方法来排序/订购这个基于datetime元素?

使用usort()和一个自定义比较函数:

 function date_compare($a, $b) { $t1 = strtotime($a['datetime']); $t2 = strtotime($b['datetime']); return $t1 - $t2; } usort($array, 'date_compare'); 

编辑 :您的数据组织在一个数组的数组。 为了更好地区分这些内容,我们调用内部数组(数据)记录,以便您的数据真的是一组记录。

usort会将这些记录中的两个传递给给定的比较函数date_compare()date_compare然后提取每个记录的"datetime"字段作为一个UNIX时间戳(一个整数),并返回差异,如果两个日期相等,结果将是0 ,如果第一个( $a )是如果第二个参数( $b )较大,则为较大值或负值。 usort()使用这个信息来排序数组。

这应该工作。 我通过strtotime将日期转换为unix时间。

  foreach ($originalArray as $key => $part) { $sort[$key] = strtotime($part['datetime']); } array_multisort($sort, SORT_DESC, $originalArray); 

从php7中你可以使用Spaceship操作符 :

 usort($array, function($a, $b) { return new DateTime($a['datetime']) <=> new DateTime($b['datetime']); }); 

http://us2.php.net/manual/en/function.array-multisort.php见第三个例子:;

 <?php $data[] = array('volume' => 67, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 1); $data[] = array('volume' => 85, 'edition' => 6); $data[] = array('volume' => 98, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 6); $data[] = array('volume' => 67, 'edition' => 7); foreach ($data as $key => $row) { $volume[$key] = $row['volume']; $edition[$key] = $row['edition']; } array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); ?> 

fyi,使用unix(1970年以后的秒数)或mysql时间戳(YmdHis – 20100526014500)对于解析器来说会更容易,但是我认为对你来说没有任何区别。

 $array = Array ( [0] => Array ( [id] => 2 [type] => comment [text] => hey [datetime] => 2010-05-15 11:29:45 ) [1] => Array ( [id] => 3 [type] => status [text] => oi [datetime] => 2010-05-26 15:59:53 ) [2] => Array ( [id] => 4 [type] => status [text] => yeww [datetime] => 2010-05-26 16:04:24 ) ); print_r($array); $name = 'datetime'; usort($array, function ($a, $b) use(&$name){ return $a[$name] - $b[$name];}); print_r($array); 

按照指定的mysql datetime字段和顺序排序记录/ 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 (strtoupper($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)); 

我碰到这个帖子,但我想按时间排序,当我的课堂内返回的项目,我得到了一个错误。

所以我研究php.net网站,并最终这样做:

 class MyClass { public function getItems(){ usort( $this->items, array("MyClass", "sortByTime") ); return $this->items; } public function sortByTime($a, $b){ return $b["time"] - $a["time"]; } } 

你可以在PHP.net网站上找到非常有用的例子

我的数组看起来像这样:

  'recent' => array 92 => array 'id' => string '92' (length=2) 'quantity' => string '1' (length=1) 'time' => string '1396514041' (length=10) 52 => array 'id' => string '52' (length=2) 'quantity' => string '8' (length=1) 'time' => string '1396514838' (length=10) 22 => array 'id' => string '22' (length=2) 'quantity' => string '1' (length=1) 'time' => string '1396514871' (length=10) 81 => array 'id' => string '81' (length=2) 'quantity' => string '2' (length=1) 'time' => string '1396514988' (length=10) 

你可以简单地使用带有回调函数的usort()来解决这个问题。 无需编写任何自定义功能。

 $your_date_field_name = 'datetime'; usort($your_given_array_name, function ($a, $b) use (&$name) { return strtotime($a[$name]) - strtotime($b[$name]); });