我正在处理我的用户的具体请求,我无法“破解”。
情况:
我们使用历史数据,有时会有未知的日期值。例如,我们知道1943年发生的事情,但我们不确切知道什么时候,什么日期和月份。有时我们确实有确切的日期。我们使用日期从 - 到,并且通常这些被链接,因此当一个事件结束时,另一个事件开始。您可以将这些事件视为船舶在海上和港口的日期。
示例:
我们有两条记录(在这个例子中,实际上我们可以在一个帖子中有几十条记录),具有这样的结构
Date From - Date To - Event
01.01.1943 - 01.02.1943 - Event 1
DD.MM.1943 - 01.04.1943 - Event 2
01.04.1943 - DD.11.1943 - Event 3
DD.02.1943 - 28.02.1943 - Event 4
DD和MM保留“day uknown”和“month uknown”,因此日期格式保持DD.MM.YYYY格式以便进一步处理。
问题:
人眼和大脑可以快速排序,有两个相关事件 - 一个接一个,因为它看到事件2中的“日期到”等于事件3中的“日期”,并排序他们的顺序正确。但是,当我想在代码中执行它时,我使用一些php array_sort函数(例如,仅通过dateFrom对其进行排序),我将获得此BAD命令
Date From - Date To - Event
01.01.1943 - 01.02.1943 - Event 1
01.04.1943 - DD.11.1943 - Event 3
DD.02.1943 - 28.02.1943 - Event 4
DD.MM.1943 - 01.04.1943 - Event 2
由于“DD”字符串前面的字母“01”的顺序。预期正确的订单
Date From - Date To - Event
01.01.1943 - 01.02.1943 - Event 1
DD.02.1943 - 28.02.1943 - Event 4
DD.MM.1943 - 01.04.1943 - Event 2
01.04.1943 - DD.11.1943 - Event 3
有没有办法,如何以与人类大脑相同的方式订购?老实说,我不知道如何接受这个。
谢谢
答案 0 :(得分:0)
首先,对于排序,最好将日期保存在内部YYYY-MM-DD,以便1943-04-01低于1943-11-DD。 可能是您可以使用隐藏属性进行排序。
其次不清楚如何处理你的未知数据我可以将所有未知日期设置为零,但我认为这不是你想要的 例如,
Event 1 :DD.MM.1943 - 01.04.1943
Event 2 :01.04.1943 - DD.11.1943
Event 3 :DD.MM.1943 - DD.12.1943
我认为您可以使用排序日期字段,这不是确切的,但可以帮助您进行排序
如果几乎知道日期,则排序日期是日期。 如果有未知部分但已知日期,则排序日期为 - 1天
我认为您需要更多角色,而某些部分可能并不总是正确但可能对您有帮助
答案 1 :(得分:0)
第二次尝试。这使用您的新输入数据提供所需的输出。
方法:(Demo)
$post='Date From - Date To - Event
01.01.1943 - 01.02.1943 - Event 1
01.04.1943 - DD.11.1943 - Event 3
DD.02.1943 - 28.02.1943 - Event 4
DD.MM.1943 - 01.04.1943 - Event 2';
$rows=array_slice(explode("\r\n",$post),1); // split by linebreak, remove column heading row
preg_match_all('/- ([\dD]{2}).([\dM]{2}).([\dY]{4})/',$post,$to_bits,PREG_SET_ORDER); // extract Date To values
foreach($to_bits as $i=>$a){
$keyed_rows["{$a[3]}-{$a[2]}-{$a[1]}"]=$rows[$i]; // assign Date To values as keys
}
ksort($keyed_rows); // sort by keys ASC
echo "Date From - Date To - Event\n",implode("\n",$keyed_rows);
输出:
Date From - Date To - Event
01.01.1943 - 01.02.1943 - Event 1
DD.02.1943 - 28.02.1943 - Event 4
DD.MM.1943 - 01.04.1943 - Event 2
01.04.1943 - DD.11.1943 - Event 3
如果这不能满足您对实际项目数据的要求,请使用示例输入改进您的问题,该输入会在我的方法中暴露出错误。
答案 2 :(得分:0)
@Radek,我稍微改进了我的想法,这里有一个算法作为起点。可能需要进一步改进,但您可以使用您的数据进行测试......
where prn=$prn
>