標籤:php 任務分配系統
<?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));
本文出自 “專註php 群號:414194301” 部落格,請務必保留此出處http://jingshanls.blog.51cto.com/3357095/1856896
[李景山php]php 實現簡單的任務分配系統