Page 1 of 1

Reading/assigning array trouble.

Posted: Tue Feb 02, 2010 11:25 am
by tymlls05
Purpose of script: The script below serves to automatically generate a floor schedule for the following month. It grabs all agents from the database and distributes them fairly and equally throughout the month. On Sundays it appoints one schedule. On Saturday it appoints two schedules at two different times. On weekdays, it does the same as Saturday only with slightly different times. It never puts appoints and agent to a schedule twice in one day. And should not appoint the agent again until all other agents have been used.

My Problem: Some agents are being used up to four times while other agents are only be assigned once in the entire month.

Details about the problem: I am trying to use two arrays to contain who has been used and how many times. $arrMAX[] contains information about how many times an agent has been used. $maxuse is the variable that dictates the max number of uses per agent in each month. $used[] is the array that contains which agents have been used.

Code: Select all

<?  
 
    $con=mysql_connect('LOCALHOST','MY.ROOT.USER','MY.ROOT.PASSWORD'); 
    if (!$con){
        die('Could not connect: ' . mysql_error());
    }
    mysql_select_db("MYAGENT.TABLE", $con);
    session_start();
    //TODAY'S DATE
 
    $start = date("Y-m-d");
    $startY =  date("Y");
    $startm =date("m");
    $startd =date("d");
    $nextM=$startm+1;
    function leapYear($year){
 if ($year % 400 == 0 || ($year % 4 == 0 && $year % 100 != 0)) return TRUE;
 return FALSE;
}
function daysInMonth($month = 0, $year = ''){
 $days_in_month    = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 $d = array("Jan" => 31, "Feb" => 28, "Mar" => 31, "Apr" => 30, "May" => 31, "Jun" => 30, "Jul" => 31, "Aug" => 31, "Sept" => 30, "Oct" => 31, "Nov" => 30, "Dec" => 31);
 if(!is_numeric($year) || strlen($year) != 4) $year = date('Y');
 if($month == 2 || $month == 'Feb'){
  if(leapYear($year)) return 29;
 }
 if(is_numeric($month)){
  if($month < 1 || $month > 12) return 0;
  else return $days_in_month[$month - 1];
 }
 else{
  if(in_array($month, array_keys($d))) return $d[$month];
  else return 0;
 }
} 
    //Max days in next month
    $maxdays =daysInMonth(02, $startY);
    echo 'Number of days in next month: '.$maxdays.'<p>';
    $daycount=1;
    //Max number of times each agent can be used for month
    $maxuse=(($maxdays*2)-4)/22;
    $maxuse=ceil($maxuse);
    $arrMAX["first"]=1;
    echo 'Maxuse Per Agent Next Month: '.$maxuse.'<p>';
    
    echo 'We are now trying to start generating a schedule';
    for ($daycount; $daycount <= $maxdays; $daycount++) {
        $next = date('Y-m-d', mktime(0, 0, 0, $nextM, $daycount, $startY));
        $daytext=date('l', strtotime($next));
        If ($daytext=="Sunday"){
            $preexist=mysql_query('SELECT `start_date` FROM `event_schedules` where `start_date`=\''.$next.'\'');
            while($checkexistance = mysql_fetch_array($preexist)){
                $exist=true;
            }
            if ($exist){
                unset($exist);
                echo 'Date already exist: '.$next;
            } else {
                echo '<div style="background-color:lightgreen"><hr><h3>'.$daytext.'</h3>';
                echo '<p>Day '.$daycount.'</div>';
                echo 'Looking to insert into date: '.$next.'<p>';
                //Select RANDOM EVENT (AGENT) TO ASSIGN TO DAY
                $offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `event_categories_events` WHERE event_category_id = '2'  ") or die(mysql_error());
                $offset_row = mysql_fetch_object( $offset_result );
                $offset = $offset_row->offset;
                $floor_events = mysql_query( " SELECT * FROM `event_categories_events` WHERE event_category_id = '2' LIMIT $offset, 1 " ); 
                
                //Grab Random Event from All Events  (Agents) Assigned To The Floor Schedule Category
                while($grabFloorEvent = mysql_fetch_array($floor_events)){
                    //For every event id we grab, grab the event (agent) details.
                    $agent=$grabFloorEvent['event_id'];
                        unset($used);
                        $used= array();
                    if ($arrMAX[$agent]>=3) {
                    $am--;
                    $daycount--;
                        break;
                        
                    }
                        $used[]=$agent;
                        
                        $arrMAX["$agent"]=+1;
                    $agent_details = mysql_query('SELECT * FROM `events` WHERE `id`=\''.$agent.'\'');
                    while($grabAgent_details = mysql_fetch_array($agent_details)){
                        $AgentName=$grabAgent_details['title'];
                        $AgentLink=$grabAgent_details['link'];
                        $AgentDescription=$grabAgent_details['description'];
                        $IsAgentPublished=$grabAgent_details['publish'];
                        $AgentNoticeEmail=$grabAgent_details['notice_email'];
                        mysql_query("INSERT INTO event_schedules 
                            (event_id,  start_date, start_time, end_date,end_time, frequency, daily_interval, weekly_interval)
                            VALUES ('$agent', '$next', '13:00:00', '$next', '16:00:00', '0', '1', '1')") or die(mysql_error());
                        echo "Name: $agent $AgentName <br>
                            Link: $AgentLink <br>
                            Description: $AgentDescription <br>
                            Published: $IsAgentPublished <br>
                            Notify: $AgentNoticeEmail  <br> <br>";
                        break;
                    }
                }
            }
        } elseif ($daytext=="Saturday"){
                $preexist=mysql_query('SELECT `start_date` FROM `event_schedules` where `start_date`=\''.$next.'\'');
            while($checkexistance = mysql_fetch_array($preexist)){
                $exist=true;
            }
            if ($exist){
                unset($exist);
                echo 'Date already exist: '.$next;
            } else {
            for ($am=0; $am < 2; $am++) {
                echo $am;
                echo '<div style="background-color:lightgreen"><hr><h3>'.$daytext.'</h3>';
                echo '<p>Day '.$daycount.'</div>';
                echo 'Looking to insert into date: '.$next.'<p>';
                //Select RANDOM EVENT (AGENT) TO ASSIGN TO DAY
                $offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `event_categories_events` WHERE event_category_id = '2'  ") or die(mysql_error());
                $offset_row = mysql_fetch_object( $offset_result );
                $offset = $offset_row->offset;
                $floor_events = mysql_query( " SELECT * FROM `event_categories_events` WHERE event_category_id = '2' LIMIT $offset, 1 " ); 
                        
                //Grab Random Event from All Events  (Agents) Assigned To The Floor Schedule Category
                while($grabFloorEvent = mysql_fetch_array($floor_events)){
                    //For every event id we grab, grab the event (agent) details.
                    $agent=$grabFloorEvent['event_id'];
                    if (in_array($agent, $used) || $arrMAX["$agent"]>=3) {
                    $am--;
                    $daycount--;
                        break;
                        
                    } else {
                    $used[]=$agent;
                    $arrMAX["$agent"]=+1;
                    
                    $agent_details = mysql_query('SELECT * FROM `events` WHERE `id`=\''.$agent.'\'');
                    while($grabAgent_details = mysql_fetch_array($agent_details)){
                        $AgentName=$grabAgent_details['title'];
                        $AgentLink=$grabAgent_details['link'];
                        $AgentDescription=$grabAgent_details['description'];
                        $IsAgentPublished=$grabAgent_details['publish'];
                        $AgentNoticeEmail=$grabAgent_details['notice_email'];
                        $preexist=mysql_query('SELECT `start_date` FROM `event_schedules` where `start_date`=\''.$next.'\' && `event_id`=\''.$agent.'\'');
                        while($checkexistance = mysql_fetch_array($preexist)){
                            $exist=true;
                        }
                        if ($exist){
                        
                            unset($exist);
                            $daycount=$daycount-1;
                            break;
                        } 
                        if ($am==0){
                            mysql_query("INSERT INTO event_schedules 
                                (event_id,  start_date, start_time, end_date,end_time, frequency, daily_interval, weekly_interval)
                                VALUES ('$agent', '$next', '09:00:00', '$next', '12:30:00', '0', '1', '1')") or die(mysql_error());
                            echo'morning';
                        } else {
                            echo'noon';
                            mysql_query("INSERT INTO event_schedules 
                                (event_id,  start_date, start_time, end_date,end_time, frequency, daily_interval, weekly_interval)
                                VALUES ('$agent', '$next', '12:30:00', '$next', '16:00:00', '0', '1', '1')") or die(mysql_error()); 
                        }
                        echo "Name: $agent $AgentName <br>
                            Link: $AgentLink <br>
                            Description: $AgentDescription <br>
                            Published: $IsAgentPublished <br>
                            Notify: $AgentNoticeEmail  <br> <br>";
                        break;
                    }
                }
            }
        } }}else {
        $preexist=mysql_query('SELECT `start_date` FROM `event_schedules` where `start_date`=\''.$next.'\'');
            while($checkexistance = mysql_fetch_array($preexist)){
                $exist=true;
            }
            if ($exist){
                unset($exist);
                echo 'Date already exist: '.$next;
            } else {
            for ($am=0; $am < 2; $am++) {
                echo $am;
                echo '<div style="background-color:lightgreen"><hr><h3>'.$daytext.'</h3>';
                echo '<p>Day '.$daycount.'</div>';
                echo 'Looking to insert into date: '.$next.'<p>';
                //Select RANDOM EVENT (AGENT) TO ASSIGN TO DAY
                $offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `event_categories_events` WHERE event_category_id = '2'  ") or die(mysql_error());
                $offset_row = mysql_fetch_object( $offset_result );
                $offset = $offset_row->offset;
                $floor_events = mysql_query( " SELECT * FROM `event_categories_events` WHERE event_category_id = '2' LIMIT $offset, 1 " ); 
                //Grab Random Event from All Events  (Agents) Assigned To The Floor Schedule Category
                while($grabFloorEvent = mysql_fetch_array($floor_events)){
                    //For every event id we grab, grab the event (agent) details.
                    $agent=$grabFloorEvent['event_id'];
                    if (in_array($agent, $used) || $arrMAX["$agent"]>=3) {
                    $am--;
                    $daycount--;
                        break;
                        
                    } else {
                    $used[]=$agent;
                    $arrMAX["$agent"]=+1;
                    
                    $agent_details = mysql_query('SELECT * FROM `events` WHERE `id`=\''.$agent.'\'');
                    while($grabAgent_details = mysql_fetch_array($agent_details)){
                        $AgentName=$grabAgent_details['title'];
                        $AgentLink=$grabAgent_details['link'];
                        $AgentDescription=$grabAgent_details['description'];
                        $IsAgentPublished=$grabAgent_details['publish'];
                        $AgentNoticeEmail=$grabAgent_details['notice_email'];
                        if ($am==0){
                            mysql_query("INSERT INTO event_schedules 
                                (event_id,  start_date, start_time, end_date,end_time, frequency, daily_interval, weekly_interval)
                                VALUES ('$agent', '$next', '08:30:00', '$next', '13:00:00', '0', '1', '1')") or die(mysql_error());
                            echo'morning';
                        } else {
                            echo'noon';
                            mysql_query("INSERT INTO event_schedules 
                                (event_id,  start_date, start_time, end_date,end_time, frequency, daily_interval, weekly_interval)
                                VALUES ('$agent', '$next', '13:00:00', '$next', '17:00:00', '0', '1', '1')") or die(mysql_error()); 
                        }
                        echo "Name: $agent $AgentName <br>
                            Link: $AgentLink <br>
                            Description: $AgentDescription <br>
                            Published: $IsAgentPublished <br>
                            Notify: $AgentNoticeEmail  <br> <br>";
                        break;
                    }
                }}
            }
        }
    }}
?>