Скрипт для датированной скидки

Я немного новичок в PHP, поэтому написание скрипта все еще продолжается. У меня есть страница, на которой пользователи регистрируются на семинар, за который они должны платить. Если они зарегистрируются за 5 дней до начала семинара, они получат скидку, если они зарегистрируются за 5 дней до начала семинара, они должны будут заплатить полную стоимость. Я написал PHP-скрипт, который, я думаю, сделает это (работает в любом случае, это тестирование), но у меня есть ощущение, что есть лучший способ написать его. Я просто ищу любые предложения, которые у кого-то есть, если таковые имеются. Ваша помощь очень ценится. Мой сценарий выглядит следующим образом.

date_default_timezone_set('MST');
$discount_check  = date("YmdHis", mktime(date("H"), date("i"), date("s"), date("m") , date("d")+5 , date("Y") ));

//Made an array because there are several seminars a year and because I need to make it easy enough for others in my office (who don't know PHP) to add/edit seminar dates
$array = array(
'Utah_seminar' => '20120130153804',
'Seattle_seminar' => '20120723000000',
'Florida_seminar' => '20121005000000'
);

while ($seminar_dates = current($array)) 
{
    if ($discount_check >= $seminar_dates) 
    {
        echo 'discount is not eligible';
        break;
    }
    else
    {
        echo 'discount received';
        break;
    }
next($array);
}

Опять же, любая помощь приветствуется. Даже если он находит какие-либо проблемы с кодом.


person Jamie Fritz    schedule 26.01.2012    source источник


Ответы (3)


Поскольку вы используете break, ваш цикл будет выполняться только один раз. Если я понимаю, что вы пытаетесь сделать, вы должны использовать:

$eligable = false;
foreach ($array as $seminar_date) {
  if ($discount_check < $seminar_date) {
    $eligable = true;
    break;
  }
}

if ($eligable) {
  echo 'discount received';
} else {
  echo 'discount is not eligible';
}

Я изменил цикл while на foreach, так как я думаю, что они более тривиальны для понимания.

person Dor Shemer    schedule 26.01.2012
comment
Большое спасибо за ваш ответ. Я должен был быть немного более ясным в своем вопросе, и это было то, что я, вероятно, удалю дату, когда она проходит из массива. Я думаю, что это просто природа зверя. Я очень ценю ваш ответ и то, что вы нашли время. - person Jamie Fritz; 27.01.2012

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

$discount_check = mktime(date());
//Sort array in reverse order
arsort($array);
for($i = 0; $i < count($array);$i++){
    //If array value meets the discount criteria, 
    if($array[$i]  <=   $discount_check - 432000){
    //The index of the first array item to match the discount criteria, since array is sorted all subsquent are applicable
        $split = $i;
        $i = count($i);
    }   
}
person CBusBus    schedule 26.01.2012

person    schedule
comment
Может также быть идея поместить количество дней в переменную на случай, если конкретная сделка изменится? - person Hecksa; 26.01.2012
comment
Большое спасибо за ваш ответ. Я не уверен, что понимаю все это, но сейчас я ищу, не могу ли я понять это. Несмотря ни на что, я очень ценю это. - person Jamie Fritz; 27.01.2012