我有一系列的约会,我需要以特殊的方式订购。我们假设当前日期是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我的密钥会被覆盖。
答案 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;