1

私は過去数日間、このコードを断続的に使用してきましたが、理解できません。

私がする必要があるのは、現在の時間がユーザーによって設定された時間内にあるかどうかに応じて、関数から 0 または 1 を返すことです。時刻と日付がユーザーが設定した 4 つの値の配列内にある場合は 1 を返し、そうでない場合は 0 を返します。ユーザーは、複数の期間に対して複数の配列を設定できます。

私はしばらくの間、このコードで作業しようとしてきました:

functions.php:

function determineWoE($woe) {
  $curDayWeek = date('N');
  $curTime = date('H:i');
  $amountWoE = count($woe['WoEDayTimes']); // Determine how many WoE times we have.
  if ( $amountWoE == 0 ) {
    return 0; // There are no WoE's set! WoE can't be on!
  }
  for ( $i=0; $i < $amountWoE; $i++ ) {
    if ( $woe['WoEDayTimes'][$i][0] == $curDayWeek && $woe['WoEDayTimes'][$i][2] == $curDayWeek ) { // Check the day of the week.
      if ( $woe['WoEDayTimes'][$i][1] >= $curTime && $woe['WoEDayTimes'][$i][3] <= $curTime ) { // Check current time of day.
        // WoE is active
        return 1;
      }
      else {
        // WoE is not active
        return 0;
      }
    }
    else {
      // WoE is not active
      return 0;
    }
  }
}

そして...ユーザーがこの機能に必要なだけ多くの期間を設定する場所:

$woe = array( // Configuration options for WoE and times.
  // -- WoE days and times --
  // First parameter: Starding day 1=Monday / 2=Tuesday / 3=Wednesday / 4=Thursday / 5=Friday / 6=Saturday / 7=Sunday
  // Second parameter: Starting hour in 24-hr format.
  // Third paramter: Ending day (possible value is same or different as starting day).
  // Fourth (final) parameter: Ending hour in 24-hr format.
  'WoEDayTimes'   => array(
    array(6, '18:00', 6, '19:00'), // Example: Starts Saturday 6:00 PM and ends Saturday 7:00 PM
    array(3, '14:00', 3, '15:00')  // Example: Starts Wednesday 2:00 PM and ends Wednesday 3:00 PM
  ),
);

しかし、私が何をしても... 関数 defineWoE は常に 0 を返します。

関数に for ではなく foreach が必要ですか? 時間がユーザー設定可能な時間内にある場合、determinWoE が 1 を返すようにするにはどうすればよいですか?

for を foreach に変更してみました:

foreach ( $woe['WoEDayTimes'] as $i ) {

そして今、私はエラーを受け取ります:警告:行76の/var/www/jemstuff.com/htdocs/ero/functions.phpの不正なオフセットタイプ

...なぜそのエラーが発生するのかわかりません。76 行目は次のとおりです。

if ( $woe['WoEDayTimes'][$i][0] == $curDayWeek && $woe['WoEDayTimes'][$i][2] == $curDayWeek ) { // Check the day of the week.

functions.php 内

var_dump($woe)

array(2) { ["WhoOnline"]=> string(2) "no" ["WoEDayTimes"]=> array(2) { [0]=> array(4) { [0]=> int(6) [1]=> string(5) "18:00" [2]=> int(6) [3]=> string(5) "19:00" } [1]=> array(4) { [0]=> int(3) [1]=> string(5) "14:00" [2]=> int(3) [3]=> string(5) "15:00" } } }

あなたが私に提供できる助けをありがとう。:)

4

1 に答える 1

2

いくつかのマイナーポイント:

  • foreachループとforループはどちらも問題なく機能しますが、チェックする曜日や時間を確認する必要foreachがないため、より便利な場合があります。count()

  • 1 または 0 ではなく、ブール値のtrueorを返す必要があります。false

なぜそのエラーが発生するのかわかりませんが、より大きな問題は時間を比較する方法です。文字列 times を数値型にキャストすると、思ったように完全には変換されません。例えば...

"14:00" < "14:59"

...両方の文字列を 14 にキャストするため、false になります。したがって、最初の文字列は実際には 2 番目の文字列と等しくなります。

文字列を Unix タイムスタンプ (1970 年 1 月 1 日からの秒数) に変換し、それらを比較したほうがよい場合があります。

これが私がそれを行う方法の大まかな考えです:

// Function to help get a timestamp, when only given a day and a time
// $today is the current integer day
// $str should be 'last <day>', 'next <day>', or 'today'
// $time should be a time in the form of hh:mm
function specialStrtotime($today, $day, $time) {

    // An array to turn integer days into textual days
    static $days = array(
        1 => 'Monday',
        2 => 'Tuesday',
        3 => 'Wednesday',
        4 => 'Thursday',
        5 => 'Friday',
        6 => 'Saturday',
        7 => 'Sunday'
    );

    // Determine if the day (this week) is in the past, future, or today
    if ($day < $today) {
        $str = 'last ' . $days[$day];
    } else if ($day > $today) {
        $str = 'next ' . $days[$day];
    } else {
        $str = 'today';
    }

    // Get the day, at 00:00
    $r = strtotime($str);

    // Add the amount of seconds the time represents
    $time = explode(':', $time);
    $r += ($time[0] * 3600) + ($time[1] * 60);

    // Return the timestamp
    return $;
}

// Your function, modified
function determineWoE($timeNow, $woe) {
    $dayNow = (int) date('N', $timeNow);
    foreach ($woe as $a) {
        // Determine current day

        // Determine the first timestamp
        $timeFirst = specialStrtotime($dayNow, $a[0], $a[1]);

        // Determine the second timestamp
        $timeSecond = specialStrtotime($dayNow, $a[2], $a[3]);

        // See if current time is within the two timestamps
        if ($timeNow > $timeFirst && $timeNow < $timeSecond) {
            return true;
        }
    }
    return false;
}

// Example of usage
$timeNow = time();
if (determineWoE($timeNow, $woe['WoEDayTimes'])) {
    echo 'Yes!';
} else {
    echo 'No!';
}

幸運を!

于 2012-06-03T01:29:31.053 に答える