2015-07-17 3 views
1

Я пытаюсь запустить код, который в любой день недели вернет строку. Если вам интересно, я хочу решить офисные споры по поводу того, кто в свою очередь управляет радио: просто немного удовольствияПоказать текст, основанный на дне недели

Теперь это было бы очень просто, если бы мне было всего 5 человек, чтобы распределять дни - Я мог бы просто привязать каждого человека к номеру 1-5 и сопоставить его с возвращаемым значением date ('N');, однако у меня есть 8 человек для распространения. Единственные дни, которые я хочу распространять для человека, - это будние дни (1-5), а не выходные. Распределение может быть последовательным, нет необходимости в случайном назначении.

У кого-нибудь есть идеи, как это можно достичь?

ответ

2

Вы можете просто вставить как можно больше людей, как вам нужна дата начала, и вы можете добавить праздники, если хотите.

<?php 

// add as much ppeople as you like 
$people = array('Peter', 'Mike', 'Alice', 'Aaron', 'Omar', 'Hank', 'Wade', 'Zack'); 

// Here you can add holidays 
$holidays = array('2012-07-12', '2012-07-7'); 

//set start time once 
$start = new DateTime('2015-07-7'); 

// Because the end date need to be + 1(bug?) 
$start->modify('+1 day'); 

// set date today 
$end = new DateTime('2015-07-13'); 
// otherwise the end date is excluded (bug?) 
$end->modify('+1 day'); 

// total days 
$interval = $end->diff($start); 
$days = $interval->days; 

// create an iterateable period of date (P1D equates to 1 day) 
$period = new DatePeriod($start, new DateInterval('P1D'), $end); 

foreach($period as $dt) { 
    $curr = $dt->format('D'); 

    // for the updated question 
    if (in_array($dt->format('Y-m-d'), $holidays)) { 
     $days--; 
    } 

    // substract if Saturday or Sunday 
    if ($curr == 'Sat' || $curr == 'Sun') { 
     $days--; 
    } 
} 

$days = $days % count($people); 
echo $people[$days] . " may controle the radio today"; 

?> 
+0

Как это работает в выходные? – Matadeleo

+0

Код проверяет, является ли это saterday или sunday, если это так, он вычитает этот день из общего количества дней. – PHPhil

+0

Итак, в субботу и воскресенье эхо все равно будет отображаться по пятницам? – Matadeleo

0

Если все люди должны быть назначены перед началом нового раунда вы можете сделать следующее:

<?php 
$array = array(...); // Set everybody in an Array. This could be getted on the database 
$count = count($array); // Count the array. 
For($i = 0; $i < $count; $i++){ 
    $result[$i] = array_rand($array, 1); // This gives you a random number of the person who must be assigned 
    unset(array[$result]); //Delete from the variable. 
} 
// at the end, the $array array must be empty. 
?> 

В переменных $ результата вы имеете в случайном порядке. Затем вы должны назначить их на день.

<?php 
$dayCount = 0; // Count the days from today to assign 
Foreach($result as $key=>$res){ 
    While(date('N') + dayCount < 6){ // If the day is upper than 6, its saturday or sunday 
    if(date('N') + dayCount > date('N') { //Verify that 
     $array[$key] = $res . date('Y/M/D'); // if its a working day, save it to $array variable 
    } 
    $dayCount++; // Increment the Count. 
    } 
} 
//This program is for only one time execution. 
print_r($array); 
?> 

Желаю, чтобы это сработало для вас.

(ПОЖАЛУЙСТА ИСПЫТАНИЕ ДО, я не ASSURE, что код 100% ФУНКЦИОНАЛЬНЫЙ)

+0

Привет, извинения, я не указал в своем первоначальном посте, но порядок лучше быть последовательным, поэтому система будет честно давать каждому человеку день за каждое вращение. Также код, который вы указали, имеет 'Parse error: синтаксическая ошибка, неожиданный 'массив' (T_ARRAY)', относящийся к 'unset (array [$ result])' – Matadeleo

+0

Если вы хотите сделать секвенциально, проигнорируйте первую часть. Потому что это рандомизирует массив. Ошибка в том, что нет; по предыдущей строке – Kyto

2
function number_of_working_days($from, $to) { 
    $colleagues  = ['John','Bill','Philip','Mary','Ann','Mark','George','Barry']; 
    $workingDays = [1, 2, 3, 4, 5]; # date format = N (1 = Monday, ...) 
    $holidayDays = ['*-12-25', '*-01-01', '2013-12-23']; # variable and fixed holidays 

    $from = new DateTime($from); 
    $to = new DateTime($to); 
    $to->modify('+1 day'); 
    $interval = new DateInterval('P1D'); 
    $periods = new DatePeriod($from, $interval, $to); 

    $result = array(); 
    $c_temp = $colleagues; 
    foreach ($periods as $period) { 
     if (!in_array($period->format('N'), $workingDays)) continue; 
     if (in_array($period->format('Y-m-d'), $holidayDays)) continue; 
     if (in_array($period->format('*-m-d'), $holidayDays)) continue; 

     if(sizeof($c_temp)==0){ 
      $c_temp = $colleagues; 
     } 
     shuffle($c_temp); 
     $result[$period->format('Y-m-d')] = array_pop($c_temp); 
    } 
    return $result; 
} 

foreach(number_of_working_days('2015-08-01', '2015-08-31') as $date => $colleague){ 
    echo $date . ": " . $colleague . "\n"; 
} 

выход будет выглядеть следующим образом:

2015-08-03: Barry 
2015-08-04: Bill 
2015-08-05: Mark 
2015-08-06: John 
2015-08-07: George 
2015-08-10: Philip 
2015-08-11: Ann 
2015-08-12: Mary 
2015-08-13: Ann 
2015-08-14: John 
2015-08-17: Mary 
2015-08-18: Barry 
2015-08-19: Bill 
2015-08-20: George 
2015-08-21: Philip 
2015-08-24: Mark 
2015-08-25: Barry 
2015-08-26: Ann 
2015-08-27: Mary 
2015-08-28: Philip 
2015-08-31: George 
Смежные вопросы