2017-06-30 37 views
0

私はループ内で毎日数値を表示しようとしています。最後の要素に達すると、最初の要素に再び到達する必要があります。これは毎日起こる必要があります。私は頭を痛めつけましたが、それを解決することはできませんでした。関数は、現在の数値を日/時間/分で返す必要があります。これは今まで私が試したことです。再帰的な無限日常的な動的ループ配列PHP

<?php 
function recursive_daily_deals($i = 1) { 
    $current_date = strtotime(date('d-m-Y h:i:s')); 
    $dbs_date_1 = strtotime('29-06-2017 8:20:16'); 
    $current_hour = date('h'); 
    var_dump($current_hour); 
    $products = [ 
     451, 
     455, 
     453 
    ]; 
    if ($i < count($products)) { 
     return recursive_daily_deals($i+1); 
    } 
} 
?> 

期待される出力

>  First day - June 29 2017 
>  It will appear 451 
>  Second day - June 30 2017 
>  It will appear 455 
>  3rd day - July 1st 2017 
>  It will appear 453 
>  4th Day - July 2nd 2017 
>  It will appear 453 
>  And start over 
+0

@mickmackusa私はPHP 7を使用しているので、これはPHPで行う必要があります。 – Adrian

+0

現在何の出力を得ていますか – Akintunde007

+0

なぜそれを '5.6'とタグ付けしましたか?なぜ4日目は「453」と言わなければならないのですか?あなたは '$ current_hour'で何をしていますか?試したことと期待した結果との間には大きな違いがあります。 – mickmackusa

答えて

2

最初に、開始日から何日が経過したかを知る必要があります。あなただけの実際のタイムスタンプから始まるタイムスタンプをサブに必要なことを実行します。

$dbs_date_1 = strtotime('29-06-2017 8:20:16'); 
$actualTimestamp = time(); 
$elapsedSec = $dbs_date_1 - $actualTimestamp; 

// we need to get days from seconds 
$elapsedDays = $elapsedSec/(3600*24); 
$elapsedDays = floor($elapsedDays); 

ですから、開始日以降となっている日数がある場合。 round()の代わりにfloor()を使用します。これは、スクリプトが半日後に実行されると、日数+1を返すためです。我々はフローリングで、完成したサイクル数を格納し

$nbItems = count($products); 
$cycleCount = $elapsedDays/$nbItems; 
$finishedCycles = floor($cycleCount); 

この日数で、私たちはすでに我々のアレイ内の項目数によって経過日数を分割することによって行われるサイクル数を持つことができますサイクル数。その後、経過した日からこれらのサイクルを完了するのに要した日数を減らすだけで、インデックスの位置が得られます。

$completeDays = $finishedCycles * $nbItems; 
$actualPosition = $elapsedDays - $completeDays; 
return $products[$actualPosition]; 
1

これはもともと投稿コードの簡易版ですが、私は次のようにそれは、OPが求めてロジックのようなものが含まれていると信じて:

<?php 
    $products = [ 
     451, 
     455, 
     453 
    ]; 

    $modfactor = count($products); 
    $days = null; 

    $weekdays = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]; 

    for ($i=0, $max = 7; $i < $max; $i++) { 
      $days[$i] = $i % $modfactor;   
    } 


    foreach ($weekdays as $dex => $wday) { 
      echo "$wday, "; 
      echo $products[ $days[$dex] ], "\n"; 
    } 

参照demo

更新:デモhereこれはarray_map()を利用し、現在のプロダクトIDも取得します。

ループは常に存在しますが、無限ではありません。製品の数が変化すると、モジュレータも変更されます。一定のものは週の曜日です。コードを動作させるために、モジュロ演算を利用しています。

+0

したがって、現在のIDを取り出すには、次のようにする必要があります: 'echo $ products [$ days [0]];'? – Adrian

+0

現在のIDは、$ weekdaysにマップされた配列$ daysに格納されます。したがって、現在金曜日の場合は、現在のIDを出力するにはecho $ products [$ days [4] - https:// 3v4lを参照してください。org/isNAG – slevy1

+0

ありがとうございます。また、平日にディナミックを始めるために、このような配列を作成しました。 '\t $ timestamp = strtotime($ weekday); //土曜日$ days = array(); ($ i = 0; $ i <7; $ i ++){$ weekdays [] = strftime( '%A'、$ timestamp); $ timestamp = strtotime( '+ 1日'、$タイムスタンプ); \t \t} 'これは、この方法で曜日を基準とした正確な時刻を持つことになります。最初の方法はVIAの正確な時刻(時/分/秒)の開始です。 – Adrian