<?php /** * Created by PhpStorm. * User: ziniu * Date: 2016/9/21 * Time: 10:58 */ // /** * 任务描述: * 小白一家有五口人,分别是爸爸、妈妈、哥哥、姐姐, * 每天要执行的家庭任务分别是拖地、洗碗、买菜,其中,洗碗每天要做两次, * 而买菜又必须是爸爸或者妈妈才能购买! * 小白学习了编程,小白的爸爸要求小白用程序安排一个工作计划表,尽量做到 * 每个人的任务相对均衡,以周为单位即可! * * 任务分析: * 问题1:对于只能父母执行的任务,如“买菜”,就是类似于级别问题 * 需要给相应的人给提升到相应的级别! * 问题2:对于“洗碗”这样需要每天执行两次的任务,我们可以直接复制出来一份 * 就类似于两个“洗碗”任务,每个任务每天仅执行一次,就可以了。 * 问题3:对于“买菜”类高级任务,需要给任务加上对应执行的级别要求。 * * 特别说明: * 本案例为了能最大化的展示基础阶段的知识点,暂时没有做代码及结构优化! */ // 第一步: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 ); /** * 说明:因为每个任务每天执行的次数不一样,所以根据任务的执行次数 * 重新设置任务数组为带执行次数的二维数组。 * @param $missions * @return array */ 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);// 执行函数 获取新的任务数组 /** * 说明:根据设置的二维数组中每个对应的任务次数不同,转换成为不同的 * 一维数组 * @param $missions * @return array */ 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); /** * 说明:根据任务要求设置对应的任务跟人的执行权限。 * @param $family * @param $missions * @return array */ 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天,进行任务分配了。 /** * 说明:任务分配主程序,传入“人员”跟“任务”,返回对应排序结果。 * @param array $data * @return array */ 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 "********************************************************<br />"; echo "选择进行分配第{$i}天任务:<br />"; echo "********************************************************<br />"; $temp = [];// 初始化 返回结果 数组 foreach($mission as $k => $v){// 循环保证到每个任务都可以分配到人 // 打印提示字符串 echo "####################任务分配开始######################<br />"; echo "--进行第《{$i}》天第《".($k+1)."》个任务《{$v[‘missionName‘]}》任务分配:<br />"; // 获取最适合的人选,通过分步获取适合候选人,及最小任务的人的方式实现。 $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‘]}<br />"; echo "####################任务分配结束######################<br />"; echo "<br /><br />"; } $missionTable[] = $temp;// 代表一天的任务分配完成。 }// 代表一周的任务分配完成。 return $missionTable;// 返回数据 } /** * 说明:根据任务的级别,选择可以执行任务的候选人。 * @param $family * @param $mission * @return mixed */ 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‘];// 返回最小任务执行次数的人的名字 } /** * 说明:根据人员名单,找到目前任务最少的那个人。就是多维数组排序问题 * @param $family * @return mixed */ 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 "<pre />"; var_dump(makeMission($data));
时间: 2024-10-12 20:26:04