//
// 第一步:1.1 代码化 家庭成员 初始化 单独定义
$father = "爸爸";
$mother = "妈妈";
$brother = "哥哥";
$sister = "姐姐";
$myself = "小白";
// 第一步:1.2 组合家庭成员为数组,成为一个整体,方便编程操作
$family = array(
$father,
$mother,
$brother,
$sister,
$myself
);
//第二步:2.1 代码化 任务 初始化 单独任务
$mission1 = "拖地";// 每天一次。
$mission2 = "洗碗";// 每天两次。
$mission3 = "买菜";// 只能父母去买。
//第二步:2.2 组合成为任务组合 成为一个整体,方便任务操作
$missions = array(
$mission1,
$mission2,
$mission3
);
function setTimes($missions){
$missionsTmp = [];
foreach($missions as $v){
switch($v){
case "洗碗";
$missionsTmp[] = ['time'=>2,'name'=>$v];
break;
default:
$missionsTmp[] = ['time'=>1,'name'=>$v];
break;
}
}
return $missionsTmp;
}
$missions = setTimes($missions);// 执行函数 获取新的任务数组
function getNewMissions($missions){
$Temp = [];
foreach($missions as $k => $v){
$Temp = array_merge($Temp,array_pad([$v['name']],$v['time'],$v['name']));
}
return $Temp;
}
$missions = getNewMissions($missions);
function setLevel($family,$missions){
// 设置成员级别
$levelParent = 10;
$levelOther = 1;
// 设置任务需要级别
$levelMissionEasy = 1;
$levelMissionHard = 8;
// 遍历家庭成员
foreach($family as $k_f => $v_f){
$defaultLevel = $levelOther;
switch($v_f){// switch 方式 获取 设置的等级值
case "爸爸":
$defaultLevel = $levelParent;
break;
case "妈妈":
$defaultLevel = $levelParent;
break;
}
$family[$k_f] = ['personName'=>$v_f,'personLevel'=>$defaultLevel];// 设置新数据
}
// 遍历任务
foreach($missions as $k_m => $v_m){
$defaultMissionLevel = $levelMissionEasy;// 设置默认级别
// if else 方式
if($v_m == "买菜"){
$defaultMissionLevel = $levelMissionHard;
}
$missions[$k_m] = ['missionName'=>$v_m,'missionLevel'=>$defaultMissionLevel];// 设置新数据
}
return ['family'=>$family,'mission'=>$missions];// 返回数据
}
$data = setLevel($family,$missions);
// 截至到目前位置,全部的“人员”跟“任务”的准备工作都完成了
// 接下来的需要执行的就是,按照一周7天,进行任务分配了。
function makeMission(array $data){
// 初始化数据
$missionTable = [];// 任务排表
$family = $data['family'];// 家庭成员
$mission = $data['mission'];// 任务清单
// 因为会根据每人每周的执行任务的次数,在这个次数里面选择最少的,所以需要初始化成员执行任务的次数。
foreach($family as $k => $v){
$v['personTimes'] = 0;
$family[$k] = $v;
}
// 如果计划安排 7天的工作任务 执行 7天循环
for($i = 1; $i <= 7; $i++){
// 打印提示字符串
echo "********************************************************
";
echo "选择进行分配第{$i}天任务:
";
echo "********************************************************
";
$temp = [];// 初始化 返回结果 数组
foreach($mission as $k => $v){// 循环保证到每个任务都可以分配到人
// 打印提示字符串
echo "####################任务分配开始######################
";
echo "--进行第《{$i}》天第《".($k+1)."》个任务《{$v['missionName']}》任务分配:
";
// 获取最适合的人选,通过分步获取适合候选人,及最小任务的人的方式实现。
$tmp = array(
'missionName' => $v['missionName'],
'personName' => getFamilyName($family,$v)
);
// 对被选中的人,执行操作任务累加操作
foreach($family as $k_f => $v_f ){
if($v_f['personName']==$tmp['personName']){
$family[$k_f]['personTimes']++;
}
}
$temp[] = $tmp;// 任务分配完成,存入临时数据仓库,代表一个任务分配完成。
// 打印提示字符串
echo "任务分配给了{$tmp['personName']}
";
echo "####################任务分配结束######################
";
echo "
";
}
$missionTable[] = $temp;// 代表一天的任务分配完成。
}// 代表一周的任务分配完成。
return $missionTable;// 返回数据
}
function getFamilyName($family,$mission){
$tmp = [];// 符合任务标准的人的存储仓库
foreach($family as $k => $v){
if($v['personLevel'] >= $mission['missionLevel']){
$tmp[] = $v;
}
}
// 将适合的人按照执行任务从小到大的次数进行排序
$person = null;//初始化 排序列表
$person = oderBy($tmp);
return $person[0]['personName'];// 返回最小任务执行次数的人的名字
}
function oderBy($family){
$sort = array(
'direction' => 'SORT_ASC', //排序顺序标志 SORT_DESC 降序;SORT_ASC 升序
'field' => 'personTimes',//排序字段
);// 存储 选项
$arrSort = array();
foreach($family AS $uniqid => $row){// 调整 排序字符串
foreach($row AS $key=>$value){
$arrSort[$key][$uniqid] = $value;
}
}
if($sort['direction']){// 如果具有排序规则
array_multisort($arrSort[$sort['field']], constant($sort['direction']), $family);
}// 执行排序处理
return $family;
}
// 格式化显示最终结果
echo "
";var_dump(makeMission($data));



