php中按日期按日期降序排列数组
我有一个数组,我想按日期排序。我无法按日期降序对其进行正确排序。请帮忙php中按日期按日期降序排列数组,php,Php,我有一个数组,我想按日期排序。我无法按日期降序对其进行正确排序。请帮忙 Array ( [1] => Array ( [1] => 11/05/2013 [2] => Executive Planning Day ) [2] => Array ( [1] => 13/06/2013 [2] => Middle Leaders Planning Day ) [3]
Array
(
[1] => Array
(
[1] => 11/05/2013
[2] => Executive Planning Day
)
[2] => Array
(
[1] => 13/06/2013
[2] => Middle Leaders Planning Day
)
[3] => Array
(
[1] => 12/07/2013
[2] => New Staff Induction Day
)
[4] => Array
(
[1] => 13/04/2013
[2] => Staff Conference Day No. 1
)
[5] => Array
(
[1] => 14/04/2013
[2] => Staff Conference Day No. 2
)
[6] => Array
(
[1] => 15/02/2013
[2] => Staff Conference Day No. 3
)
[7] => Array
(
[1] => 16/03/2013
[2] => Australia Day
)
)
像这样试试
function sortFunction( $a, $b ) {
return strtotime($a[1]) - strtotime($b[1]);
}
usort($data, "sortFunction"); //Here You can use asort($data,"sortFunction")
$orderByDate = $my2 = array();
foreach($data as $key=>$row)
{
$my2 = explode('/',$row[1]);
$my_date2 = $my2[1].'/'.$my2[0].'/'.$my2[2];
$orderByDate[$key] = strtotime($my_date2);
}
array_multisort($orderByDate, SORT_DESC, $data);
或者你也可以尝试细节,比如(只是建议)
由于strotime不符合d/m/Y格式,请尝试以下操作
function sortFunction( $a, $b ) {
return strtotime($a[1]) - strtotime($b[1]);
}
usort($data, "sortFunction"); //Here You can use asort($data,"sortFunction")
$orderByDate = $my2 = array();
foreach($data as $key=>$row)
{
$my2 = explode('/',$row[1]);
$my_date2 = $my2[1].'/'.$my2[0].'/'.$my2[2];
$orderByDate[$key] = strtotime($my_date2);
}
array_multisort($orderByDate, SORT_DESC, $data);
我会建立一个数组进行排序
$ordered = array();
foreach ($planning as $event) {
$ordered[$event['date']] = $event;
}
ksort($ordered);
使用usort(使用用户定义的比较函数按值对数组排序)
使用功能:
function cmp($a, $b) {
if ($a[1] == $b[1]) return 0;
return (strtotime($a[1]) < strtotime($b[1])) ? 1 : -1;
}
usort($data, "cmp");
函数cmp($a,$b){
如果($a[1]=$b[1])返回0;
返回(strotime($a[1])
对这里的所有答案都不太满意,所以我想我要提到的是,如果您希望对保留键的关联数组进行排序,那么您应该使用而不是。您还可以使用库从您喜欢的任何格式解析日期,库中还包括一些标准格式的日期
uasort($array,function($a,$b){
$format='d/m/Y';
$升序=假;
$zone=新的日期时区(“UTC”);
$d1=DateTime::createFromFormat($format,$a[1],$zone)->getTimestamp();
$d2=DateTime::createFromFormat($format,$b[1],$zone)->getTimestamp();
返回$递增?($d1-$d2):($d2-$d1);
});
@Gautam3164的解决方案几乎是完美的。您需要更改日期的格式。 我想说: 1987年11月10日->1987年11月10日 1987年10月11日->1987年10月11日(
$sortdate = array(
'17/08/2015',
'02/01/2017',
'05/02/2014'
);
function sortFunction($a, $b)
{
$datea = strtotime(str_replace('/', '-', $a));
$dateb = strtotime(str_replace('/', '-', $b));
if ($datea == $dateb)
{
return 0;
}
return ($datea < $dateb) ? -1 : 1;
}
usort($sortdate, "sortFunction");
echo "<pre>";
var_dump($sortdate);
'17/08/2015',
'02/01/2017',
'05/02/2014'
);
函数排序函数($a,$b)
{
$datea=strotime(str_replace('/','-',$a));
$dateb=strtotime(str_replace('/','-',$b));
如果($datea==$dateb)
{
返回0;
}
报税表($datea<$dateb)?-1:1;
}
usort($sortdate,“sortFunction”);
回声“;
var_dump($sortdate);
我花了一个晚上研究如何为我自己的类似问题做到这一点。按关联数组中键的日期对该数组进行排序 usort和usort都需要一个排序函数,您必须将该函数作为第二个参数写入并传递。usort和uasort使用sort函数比较数组中的每个项,并将结果存储为$yourArray
<?php
function array_sort($array, $on, $order=SORT_ASC)
{
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch ($order) {
case SORT_ASC:
asort($sortable_array);
break;
case SORT_DESC:
arsort($sortable_array);
break;
}
foreach ($sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}
return $new_array;
}
$people = array(
12345 => array(
'id' => 12345,
'first_name' => 'Joe',
'surname' => 'Bloggs',
'age' => 23,
'sex' => 'm'
),
12346 => array(
'id' => 12346,
'first_name' => 'Adam',
'surname' => 'Smith',
'age' => 18,
'sex' => 'm'
),
12347 => array(
'id' => 12347,
'first_name' => 'Amy',
'surname' => 'Jones',
'age' => 21,
'sex' => 'f'
)
);
print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname
我跳到这里进行关联数组排序,并在上发现了这个惊人的函数。这个函数是非常动态的,它使用指定的键按升序和降序排序 按特定键对数组排序的简单函数。保持索引关联
//your array
$arr = array();
array_push($arr, array("11/05/2013", "Executive Planning Day"));
array_push($arr, array("13/06/2013", "Middle Leaders Planning Day"));
array_push($arr, array("12/07/2013", "New Staff Induction Day"));
array_push($arr, array("13/04/2013", "Staff Conference Day No. 1"));
array_push($arr, array("14/04/2013", "Staff Conference Day No. 2"));
array_push($arr, array("15/02/2013", "Staff Conference Day No. 3"));
array_push($arr, array("16/03/2013", "Australia Day"));
var_dump($arr);
function sortDateDesc($a, $b){
$strA = implode("-", array_reverse( explode("/", $a[0]) ) );
$strB = implode("-", array_reverse( explode("/", $b[0]) ) );
return strtotime($strB) - strtotime($strA);
}
usort($arr, "sortDateDesc");
var_dump($arr);
所以请这样做:
如果您的日期格式是固定的日/月/年,那么您需要以解析器识别的字符串格式传递它,并且年-月-日是ISO标准,如果我记得很清楚的话,它可以正常工作“日期”-索引不存在我喜欢这个答案@这是因为在OP的数组中,日期被索引为“1”,而不是“日期”。相应地调整。@Gautam3164-没关系,只是为了澄清:-)@mkumpan-我知道,Gautam也相应地改变了:-)我喜欢的答案。我正在用它进行测试。它现在对我起作用了。;谢谢:)如果数组包含几十万个条目,或者如果两个字段具有相同的日期,这会让你耳目一新。mkumpan:因为考虑到他的结构,水合几十万条条目会更有效,对吗?我的数组没有日期索引名,那么它将如何工作??。我没有得到正确的数据。在这种情况下使用$event[1]
可以查看此线程:在使用您的建议后获得错误的数据:数组([0]=>Array([1]=>11/05/2013[2]=>Middle leader)[1]=>Array([1]=>10/05/2013[2]=>执行计划日[3]=>阵列([1]=>2013年6月25日[2]=>新员工入职日)[4]=>阵列([1]=>2013年6月27日[2]=>第8-12年开始)[6]=>阵列([1]=>2013年6月23日[2]=>执行计划日)}我尝试了所有建议,但数据没有按正确的降序排列。使用建议后获取错误数据:数组([0]=>数组([1]=>11/05/2013[2]=>中层领导)[1]=>数组([1]=>10/05/2013[2]=>执行计划日)[3]=>数组([1]=>25/06/2013[2]=>新员工入职日)[4]=>数组([1]=>2013年6月27日[2]=>8-12年开始)[6]=>数组([1]=>2013年6月23日[2]=>Executive Planning Day)}@neerajsharma您的日期不在。您可以用preg_match()替换它
。但是,在排序之前,只检查一次$data
,并为每个项目添加一个时间戳,这样每个项目只进行一次转换,可能会更节省时间。对您所做的操作进行一点解释会有所帮助。
<?php
function array_sort($array, $on, $order=SORT_ASC)
{
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch ($order) {
case SORT_ASC:
asort($sortable_array);
break;
case SORT_DESC:
arsort($sortable_array);
break;
}
foreach ($sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}
return $new_array;
}
$people = array(
12345 => array(
'id' => 12345,
'first_name' => 'Joe',
'surname' => 'Bloggs',
'age' => 23,
'sex' => 'm'
),
12346 => array(
'id' => 12346,
'first_name' => 'Adam',
'surname' => 'Smith',
'age' => 18,
'sex' => 'm'
),
12347 => array(
'id' => 12347,
'first_name' => 'Amy',
'surname' => 'Jones',
'age' => 21,
'sex' => 'f'
)
);
print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname
//your array
$arr = array();
array_push($arr, array("11/05/2013", "Executive Planning Day"));
array_push($arr, array("13/06/2013", "Middle Leaders Planning Day"));
array_push($arr, array("12/07/2013", "New Staff Induction Day"));
array_push($arr, array("13/04/2013", "Staff Conference Day No. 1"));
array_push($arr, array("14/04/2013", "Staff Conference Day No. 2"));
array_push($arr, array("15/02/2013", "Staff Conference Day No. 3"));
array_push($arr, array("16/03/2013", "Australia Day"));
var_dump($arr);
function sortDateDesc($a, $b){
$strA = implode("-", array_reverse( explode("/", $a[0]) ) );
$strB = implode("-", array_reverse( explode("/", $b[0]) ) );
return strtotime($strB) - strtotime($strA);
}
usort($arr, "sortDateDesc");
var_dump($arr);