<code><?php
function
schedule(
array
$date
,
$dayDutys
= 4,
$city
= null,
$isRound
= false)
{
$dutys
=
array
();
$employees
=
array
(
array
(
'account'
=>
'a'
,
'city'
=>
'上海'
),
array
(
'account'
=>
'b'
,
'city'
=>
'广州'
),
array
(
'account'
=>
'c'
,
'city'
=>
'上海'
),
array
(
'account'
=>
'd'
,
'city'
=>
'上海'
),
array
(
'account'
=>
'e'
,
'city'
=>
'上海'
),
array
(
'account'
=>
'f'
,
'city'
=>
'上海'
),
array
(
'account'
=>
'g'
,
'city'
=>
'广州'
),
array
(
'account'
=>
'h'
,
'city'
=>
'上海'
),
array
(
'account'
=>
'i'
,
'city'
=>
'广州'
),
array
(
'account'
=>
'j'
,
'city'
=>
'广州'
),
array
(
'account'
=>
'k'
,
'city'
=>
'广州'
),
array
(
'account'
=>
'l'
,
'city'
=>
'上海'
)
);
shuffle(
$employees
);
$gzNum
= 0;
$shNum
= 0;
$num
= 0;
$today
= 0;
foreach
(
$employees
as
$employee
) {
if
(!
$employee
[
'city'
]) {
continue
;
}
$nowDate
=
clone
(
$date
[0]);
if
(
$nowDate
->modify(
$today
.
' day'
) >
$date
[1]) {
break
;
}
if
(
$num
%
$dayDutys
== 0) {
$gzNum
= 0;
$shNum
= 0;
}
if
(((
$gzNum
==
$dayDutys
/ 2 &&
$employee
[
'city'
] ==
'广州'
) || (
$shNum
==
$dayDutys
/ 2 &&
$employee
[
'city'
] ==
'上海'
)) &&
$dayDutys
>= 2) {
continue
;
}
if
(
$dutys
[
'account'
] ==
$employee
[
'account'
] &&
$dutys
[
'date'
] ==
array
(
$nowDate
,
$nowDate
)) {
continue
;
}
if
(!
$isRound
&&
$dutys
[
'account'
] ==
$employee
[
'account'
] &&
$dutys
[
'date'
] ==
array
(
new
DateTime(
date
(
'Y-m-01'
)),
new
DateTime(
date
(
'Y-m-01'
) .
'1 month'
))) {
continue
;
}
$dutys
[] =
$employee
;
$num
++;
$num
%
$dayDutys
?
$today
:
$today
++;
$employee
[
'city'
] ==
'广州'
?
$gzNum
++ :
$shNum
++;
}
if
(
$num
%
$dayDutys
!= 0) {
$this
->schedule(
$date
,
$dayDutys
,
$city
, true);
}
if
(!
$num
) {
return
false;
}
return
$dutys
;
}
</code>