PHP:使用两种类型的排序构建日期数组

时间:2016-06-02 06:38:26

标签: php arrays sorting

我有一系列的约会,我需要以特殊的方式订购。我们假设当前日期是2016年5月30日,当前时间是11:00h:

$currentTimestamp = strtotime("05/30/2016 11:00");
// results in 1464620400

首先,这里是约会数组,其中包含每个约会结束的时间戳:

$allDates = [
'2016-05-24' => [
    [
        'end' => 1464086700

    ]
],
'2016-05-27' => [
    [
        'end' => 1464349500
    ]
],
'2016-05-30' => [
    [
        'end' => 1464606900

    ],
    [
        'end' => 1464614100
    ],
    [
        'end' => 1464623100
    ]
],
'2016-05-31' => [
    [
        'ende' => 1464705900
    ]
]

];

以下是诉诸此阵列的要求:

  • 结尾晚于当前时间戳的所有约会必须按降序排序。
  • 结束时间早于当前时间戳的所有约会必须按升序排序。

我想要的输出如下:

$desiredFinalArrDates = [
'2016-05-31' => [
    [
        'end' => 1464705900
    ]
],
'2016-05-30' => [
    [
        'end' => 1464623100
    ]
],
// !!! past dates start from here, ascending...
 '2016-05-24' => [
    [
        'end' => 1464086700

    ]
],
'2016-05-27' => [
    [
        'end' => 1464349500
    ]
],
 '2016-05-30' => [
    [          
        'end' => 1464606900
    ],
    [
        'end' => 1464614100
    ]
 ] 
];

如何实现$ allDates数组的预期排序?

--------------到目前为止我的尝试----------------

$future = [];
$past = [];

foreach ($allDates as $key => $subarr) {
    foreach ($subarr as $value) {
        if ($value['end'] >= $currentTimestamp) {
            $future[$key][] = $value;
        } else {
            $past[$key][] = $value;
        }
    }
}

asort($past);

$desiredFinalArrDates  = array_merge($future, $past);

问题是使用array_merge我的密钥会被覆盖。

2 个答案:

答案 0 :(得分:0)

如果表现无关紧要,你可以这样做。

1. create two arrays $arrBefore and $arrAfter. 
2. Then iterate the $allDates array (and all sub-arrays) and compare the current value with $currentTimestamp. 
3. If lower add it to the $arrBefore array, else to the $arrAfter. 
4. Then sort the arrays correspondigly (descending/ascending). 
5. Finally, merge this two arrays.

编辑: 这将创建两个正确排序的数组$arrBefore and $arrAfter。要获得所需的输出,则无法以该形式实现。那是因为你不能在一个数组中多次使用相同的密钥(例如你的2016-05-30)。

<?php


$currentTimestamp = strtotime("05/30/2016 11:00");

$allDates = [
'2016-05-24' => [
    [
        'end' => 1464086700

    ]
],
'2016-05-27' => [
    [
        'end' => 1464349500
    ]
],
'2016-05-30' => [
    [
        'end' => 1464606900

    ],
    [
        'end' => 1464614100
    ],
    [
        'end' => 1464623100
    ]
],
'2016-05-31' => [
    [
        'end' => 1464705900
    ]
]
    ];

$arrBefore = array();
$arrAfter = array();

foreach($allDates as $currKey => $currDateArr){
    foreach($currDateArr as  $currDate){

        if($currDate['end'] < $currentTimestamp){
            if(array_key_exists($currKey,$arrBefore)){
                $arrBefore[$currKey][] = $currDate['end'];          
            }else{
                $arrBefore[$currKey] = array($currDate['end']);
            }
        }else{
            if(array_key_exists($currKey,$arrAfter)){
                $arrAfter[$currKey][] = $currDate['end'];           
            }else{
                $arrAfter[$currKey] = array($currDate['end']);
            }
        }
    }
}

//sort the arrays
ksort($arrBefore);
krsort($arrAfter);

//sort sub-arrays
foreach($arrBefore as $subArr){
asort($subArr); 
}
//sort sub-arrays
foreach($arrAfter as $subArr){
rsort($subArr); 
}

print_r($arrBefore);

print_r($arrAfter);

打印:

Array ( [2016-05-24] => Array ( [0] => 1464086700 ) [2016-05-27] => Array ( [0] => 1464349500 ) [2016-05-30] => Array ( [0] => 1464606900 [1] => 1464614100 ) ) 
Array ( [2016-05-31] => Array ( [0] => 1464705900 ) [2016-05-30] => Array ( [0] => 1464623100 ) )


?>

答案 1 :(得分:0)

执行您尝试过的操作,只需add这些数组即可保留您的密钥:

$desiredFinalArrDates  = $future + $past;