9

我有一个数组,我想按日期对其进行排序。我无法按日期按降序正确排序。请帮忙。

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
    )
)
4

10 回答 10

22

像这样试试

function sortFunction( $a, $b ) {
    return strtotime($a[1]) - strtotime($b[1]);
}
usort($data, "sortFunction");   //Here You can use asort($data,"sortFunction")

或者你可以详细尝试(它只是建议)

function sortFunction($a,$b)
    if ($a[1] == $b[1]) return 0;
    return strtotime($a[1]) - strtotime($b[1]);
}
usort($data,"sortFunction");

由于strtotime 不遵守 d/m/Y 格式,请尝试这样

$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);
于 2013-05-24T10:43:34.807 回答
3

我花了一个晚上研究如何解决我自己的类似问题。按该数组中键的日期对关联数组进行排序。

usort 和uasort都需要一个排序函数,您必须编写该函数并将其作为第二个参数传递。sort 函数用于 usort 和 uasort 比较数组中的每个项目并将结果存储为 $yourArray

 function sortFunction( $a, $b ) {
           return strtotime($a[1]) - strtotime($b[1]);
 }

 uasort($yourArray, "sortFunction");
于 2017-09-03T16:58:17.800 回答
2

使用 usort(使用用户定义的比较函数按值对数组进行排序)。

usort($array, function($a1, $a2) {
   $value1 = strtotime($a1['date']);
   $value2 = strtotime($a2['date']);
   return $value1 - $value2;
});
于 2013-05-24T10:46:03.133 回答
2

使用usort()功能:

function cmp($a, $b) {
    if ($a[1] == $b[1]) return 0;
    return (strtotime($a[1]) < strtotime($b[1])) ? 1 : -1;
}

usort($data, "cmp");
于 2013-05-24T10:46:59.700 回答
2

对这里的所有答案并不完全满意,所以我想我会提到,如果您希望对保留键的关联uasort数组进行排序,那么您应该使用而不是usort. 您还可以使用该库从您喜欢的任何格式解析日期,该DateTime库还包括一些用于某些标准格式的预定义常量。

uasort($array, function($a, $b){ 
    $format = 'd/m/Y'; 
    $ascending = false;
    $zone = new DateTimeZone('UTC');
    $d1 = DateTime::createFromFormat($format, $a[1], $zone)->getTimestamp();
    $d2 = DateTime::createFromFormat($format, $b[1], $zone)->getTimestamp();
    return $ascending ? ($d1 - $d2) : ($d2 - $d1);
});

演示

于 2013-12-30T23:22:37.327 回答
2

我跳到这里进行关联数组排序,并在http://php.net/manual/en/function.sort.php上找到了这个惊人的功能。此功能非常动态,可以使用指定的键进行升序和降序排序。

按特定键对数组进行排序的简单函数。维护索引关联。

<?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
于 2017-09-29T14:23:35.033 回答
1

我会构建一个用于订购的数组。

$ordered = array();
foreach ($planning as $event) {
  $ordered[$event['date']] = $event;
}
ksort($ordered);
于 2013-05-24T10:44:04.267 回答
1

所以这样做:

//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 标准,它可以正常工作

于 2020-02-10T16:51:39.260 回答
0

@Gautam3164 的解决方案几乎是完美的。您需要更改日期的格式。我会说:

function sortFunction( $a, $b ) {
    return strtotime(str_replace('/', '-',$a[1])) - strtotime(str_replace('/', '-',$b[1]));
}
usort($data, "sortFunction");   //Here You can use asort($data,"sortFunction")

1987 年 11 月 10 日 -> 1987 年 11 月 10 日 1987 年 11 月 10 日 -> 1987 年 10 月 11 日

于 2015-01-15T11:09:18.013 回答
0
$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);
于 2015-07-06T02:30:06.273 回答