在一次用户个人经历开发中遇到一个关于入职时间和离职时间的问题,如下所示:
说明: 其实这看似简单,但是如果你添加多个工作经历时,可能出现时间交错的现象,这时为了避免这种现象,我们用到了"算法"思想来解决问题
下面是我以图的形式展示几种情况:
可能光从图,你会看不懂,那么我暂时举例说明这5种情况
说明 a : 我用每个图形表示用户的每一次工作经历
b: "已存在"表示: 我已经创建过这个创业经历.
c: "待+"表示: 我马上要进行添加的一条创业经历
注意: 其实就是: 找3个
1: 先统计已经创建好的创业经历的有几个 num
2: 找到 你将要添加的创业经历的 入职时间 >= 已存在的创业经历的离职时间 数目 num1
3: 找到 你将要添加的创业经历的 离职时间 <= 已存在的创业经历的入职时间 数目 num2
最后: 就是比较num 和 num1+num2的大小 只有两者相等的可添加,否则不可添加
添加代码如下:
/**
* 添加用户工作经历 [数组元素必须和表中字段一一对应]
* ~
* [
* 'uid' => '用户ID',
* 'company_name' => '公司简称',
* 'position' => '职位',
* 'company_addr' => '公司地址',
* 'entry_at' => '入职时间',
* 'quit_at' => '离职时间',
* 'business_card' = '名片', [可选]
* 'desc' => '说明',
* ]
* ~
*
* @param array $data 数组(要添加的数组集合)
* @return int|bool
*/
public function add($data)
{
$result = false;
if ($data && is_array($data)) {
if (!isset($data['uid']) || !$data['uid'] || !isset($data['company_name']) || !$data['company_name']) {
return $result;
}
$result = self::find()->
where([
'uid' => $data['uid'],
'company_name' => $data['company_name'],
]);
//统计符合条件的数目
$count = $result->count();
if ($count) {
//统计离职时间小于等于用户提交的入职时间的数目
$lessThanNum = self::find()->
where(['<=', 'quit_at', $data['entry_at']])->
count();
//统计入职时间大于等于用户提交的离职时间的数目
$greaterThanNum = self::find()->
where(['>=', 'entry_at', $data['quit_at']])->
count();
$num = $lessThanNum + $greaterThanNum;
if ($count != $num) {
return false;
}
}
foreach ($data as $key => $val) {
$this->$key = $val;
}
$result = $this->save() ? $this->id : false;
}
return $result;
}
[算法思想]
因为我们不允许用户添加个人经历时与已经创建好的个人经历时间段交错, 我们大致假设已经创建好了2个个人经历,首先我们要先统计个人经历数目(相同用户,公司简称)count, 然后分别统计(已经创建好的个人经历离职时间 <= 将要创建的个人经历入职时间 [即: 取名: num1])数目 和 (已经创建好的个人经历入职时间 >= 将要创建个人经历离职时间 [即: 取名: num2 ])数目; num = num1+num2 ,然后我们比较count与num的大小, 若相等,则我们允许你添加新的创业经历, 否则,我们不允许你创建.
[分别解释上面五种情况]:
1: 表示: 一个已经存在的个人经历(入职时间: 2015-1-1 离职时间: 2015-9-1), 我要添加一个同名但是时间段不同的个人经历 (入职时间: 2015-10-1 离职时间: 2015-12-1)
(从图上看, 这个个人工作经历是允许被添加的) [可添加]
计算过程: count = 1
num1 = 1
num2 = 0
num = num1 + num2
count == num ==>可添加
2: 表示: 第一个是已经创建好的个人经历(入职时间: 2015-1-1 离职时间: 2015-9-1), 第二个将要创建个人经历(入职时间: 2015-9-1 离职时间: 2015-12-1) [可添加]
计算过程: count = 1
num1 = 1
num2 = 0
num = num1 + num2
count == num ====> 可添加
3: 表示: 第一个是已经创建好的个人经历(入职时间: 2015-1-1 离职时间: 2015-5-1), 第二个是将要创建的个人经历(入职时间: 2015-3-1 离职时间: 9-1), 第三个是已经创建好的个人经历(入职时间: 2015-8-1 离职时间: 2015-11-1) [不可添加]
计算过程: count = 2
num1 = 0
num2 = 0
num = num1 + num2
count == num ====> 不可添加
4: 表示: 第一个是已经创建好的个人经历(入职时间: 2015-1-1 离职时间: 2015-5-1), 第二个是将要创建的个人经历(入职时间: 2015-3-1 离职时间: 8-1), 第三个是已经创建好的个人经历(入职时间: 2015-9-1 离职时间: 2015-12-1) [不可添加]
计算过程: count = 2
num1 = 0
num2 = 1
num = num1 + num2
count == num ====> 不可添加
5: 表示: 第一个是已经创建好的个人经历(入职时间: 2015-1-1 离职时间: 2015-9-1), 第二个是将要创建的个人经历(入职时间: 2015-3-1 离职时间: 5-1) [不可添加]
计算过程: count = 1
num1 = 0
num2 = 0
num = num1 + num2
count != num ====> 不可添加
总结: 前台页面开发遇到的情况,当然对于我这个菜鸟来说,这个算法肯定不是我想到的,因为对于现在的我来说,根本想不到,哦不对,打死也想不到, 这是我组长交给我的,说实话,确实解决了时间段交错的问题, 刚开始我没想那么复杂, 没想到一讨论,结果处理过程这么麻烦, 不过我学到了, 因为我记性不太好,所以我要记录下来, 以后万一忘了,还可以复习一下.
要坚持写博客,大霞你一定可以的, 相信自己!!!!