PHP

时间:2017-06-01 12:49:21

标签: php sorting date fuzzy

我正在处理我的用户的具体请求,我无法“破解”。

情况:

我们使用历史数据,有时会有未知的日期值。例如,我们知道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

有没有办法,如何以与人类大脑相同的方式订购?老实说,我不知道如何接受这个。

谢谢

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 

>