PHP多维数组排序与数据和时间

时间:2014-12-10 07:26:47

标签: php arrays sorting multidimensional-array

当我需要使用值对数组进行排序时,我正在处理任何多维数组排序,并且应根据日期和时间对值进行排序。我怎么能这样做。

对于某些情况,我无法通过查询来执行此操作,我需要通过PHP排序进行排序,但预定义的函数可以帮助我。

要排序的我的数组:

Array
(
    [events] => Array
        (
            [0] => Array
                (
                    [0] => 213532
                    [1] => 100% View  
                    [2] => 12/11/2014 09:00
                    [3] => 12/11/2014 11:00
                )

            [1] => Array
                (
                    [0] => 213533
                    [1] => test 80  
                    [2] => 12/11/2014 06:00
                    [3] => 12/11/2014 08:00
                )

            [2] => Array
                (
                    [0] => 213534
                    [1] => wf4  
                    [2] => 12/12/2014 00:00
                    [3] => 12/12/2014 23:59
                )

            [3] => Array
                (
                    [0] => 213535
                    [1] => Standaard:  
                    [2] => 12/12/2014 10:00
                    [3] => 12/12/2014 12:00
                )
        )
)

[2]值的每个子数组。

  

['事件'] [$ i] [2]

应该排序和重新排列。通过以下方式。

12/11/2014 06:00
12/11/2014 09:00
12/12/2014 00:00
12/12/2014 10:00

我怎么能这样做,任何逻辑帮助都会有用。

3 个答案:

答案 0 :(得分:1)

您正在寻找的是usort(),它允许您定义自己的回调/比较功能。

基本上你会想要这样的东西:

function my_event_sorter($left, $right) {
    if ($left[2] == $right[2])
        return 0;
    return strtotime($left[2]) < strtotime($right[2]) ? -1 : 1;
}

usort($events, 'my_event_sorter');

这个比较函数将接收两个参数(要比较的两个元素),并且它应该返回三个整数值中的一个:

  • -1:左边的值小于右边的值(即顺序很好)。
  • 0:两个值都相同(即订单也很好)。
  • 1:正确的值小于左边的值(即必须交换订单)。

答案 1 :(得分:1)

@Mario是对的,你可能想要的是usort。您还可以使用strtotime将字符串日期转换为整数,这很容易比较。我在这里写了一个工作的例子。您将看到我首先打印出数据(未排序),然后使用我的自定义排序功能调用usort。当我再次打印出阵列时,它现在按日期排序。

function compare($a, $b) {
    $timeA = strtotime($a[2]);
    $timeB = strtotime($b[2]);
    if ($timeA < $timeB) {
        return -1;
    } 
    if ($timeA > $timeB) {
        return 1;
    }
    return 0;
}

function printArrayContents($arr) {
    for ($i = 0; $i < count($arr); $i++) {
        echo $arr[$i][2] , "<BR>";
    }
}

$events = array(
    0 => array(
        0 => 213532,
        1 => '100% View',
        2 => '12/11/2014 09:00',
        3 => '12/11/2014 11:00'
    ),
    1 => array(
        0 => 213533,
        1 => 'test 80',
        2 => '12/11/2014 06:00',
        3 => '12/11/2014 08:00'
    ),
    2 => array(
        0 => 213534,
        1 => 'wf4',
        2 => '12/12/2014 00:00',
        3 => '12/12/2014 23:59'
    ),
    3 => array(
        0 => 213535,
        1 => 'Standaard:',
        2 => '12/12/2014 10:00',
        3 => '12/12/2014 12:00'
    )
);

echo "Unsorted:<BR>";
printArrayContents($events);

if (usort($events, "compare")) {
    echo "Sorted:<BR>";
    printArrayContents($events);
} else {
    echo "Sort failed.<BR>";
}

输出:

Unsorted:
12/11/2014 09:00
12/11/2014 06:00
12/12/2014 00:00
12/12/2014 10:00
Sorted:
12/11/2014 06:00
12/11/2014 09:00
12/12/2014 00:00
12/12/2014 10:00

答案 2 :(得分:0)

如果它们是唯一的,您可以使用日期时间值作为键,然后使用kso​​rt:

$newArray = array();
foreach($events as $event){
    $newArray[$event[2]] = $event;
}
ksort($newArray);