继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

php 实现简单的任务分配系统

烙印99
关注TA
已关注
手记 235
粉丝 92
获赞 446

<?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));

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP