2010-12-31 4 views
0

私は助けが必要です。私が今作っているのは、日付ピッカーです。私自身のためにかなり更新しています。ループの作成が多すぎる

特定の日付範囲をブロックする必要がありました。私はこれを行うためのコードを発見し、配列を利用しています。私はすきです。

私が必要としたのは、開始日と終了日のみを入力したため、範囲内のすべての日付で配列を作成する方法でした。一つ見つかった。魅力のように動作します。

しかし、今、問題があります。同じ$を使用して新しい配列を作成します。したがって、カレンダーが登録する唯一の配列は最新の配列です。基本的に、私が必要とするのはちょうど1つの配列です。

私はいくつか試しましたが、何も動作していないようです。これについては今考えています。どんな助け?

function createDateRangeArray($strDateFrom,$strDateTo) //Changes a Range of Dates to Specific Dates 
    { 
    $aryRange = array(); //Creates an Array 

    $iDateFrom = mktime(1,0,0,substr($strDateFrom,5,2),  substr($strDateFrom,8,2),substr($strDateFrom,0,4)); 
    $iDateTo = mktime(1,0,0,substr($strDateTo,5,2),  substr($strDateTo,8,2),substr($strDateTo,0,4)); 

    if ($iDateTo >= $iDateFrom) 
     { 
     array_push($aryRange,date('Y-m-d',$iDateFrom)); // first entry 

     while ($iDateFrom<$iDateTo) 
      { 
      $iDateFrom += 86400; // add 24 hours 
      array_push($aryRange,date('Y-m-d',$iDateFrom)); 
      } 
     } 

    return $aryRange; //Returns to step 1 and adds another value into the array 
    } 


$d = "SELECT startdate, enddate FROM classdetails"; 
$f = mysql_query($d); 

while ($e = mysql_fetch_array($f)) 
    { 
    while (list($g, $h) = each($e)) { $$g = $h; } 
     { 
     $aryDates = createDateRangeArray($startdate,$enddate); 
     print_r($aryDates); 
     echo "<br />"; 
     } 
    } 


私が思っていたことについては、大きく変更したとしても、私の作品の一部を取り上げた参考文献が含まれています。

わかりましたが、問題は、いったん配列を作成すると、新しい配列を作成するということにあります。私はifelseステートメント、空()、isset()、インクリメント(それを使用する方法を知らず、ちょうど長い時間を考え、それを削除した)を使って試しました。

ここで何ができますか?私はいつも(私はダミーデータの2行を持っている)は取り戻す何

Array ([0] => 2010-12-16 [1] => 2010-12-17 [2] => 2010-12-18 [3] => 2010-12-19 [4] => 2010-12-20 [5] => 2010-12-21 [6] => 2010-12-22 [7] => 2010-12-23)
Array ([0] => 2010-12-25 [1] => 2010-12-26 [2] => 2010-12-27 [3] => 2010-12-28 [4] => 2010-12-29)

問題は、ループ自体にあります。最初のインスタンスは、それが何をするのかを行います。 2番目のインスタンス以降、$ aryDatesが置き換えられます。

ご協力いただければ幸いです。

答えて

2
while (list($g, $h) = each($e)) { $$g = $h; } 

ああ良い神。変数を使用しないでください。特に、mysqlフェッチ呼び出しによって生成された完全な配列がある場合は特にそうです。これがあなたのコードをデバッグするのに問題がある理由です。

あなたは一切の変数変数のため、この

while ($e = mysql_fetch_array($f)) { 
    $aryDates = createDateRangeArray($e['startdate'],$e['enddate']); 
    print_r($aryDates); 
    echo "<br />"; 
} 

はるかに読み、何が起こっているのか従うことがはるかに簡単、そして絶対にNO NEEDのようにwhileループを書き換えることができます。その向こう

「私は変数の変数を使用してはならない」、もちろんそれは新しい配列を毎回作成しています、あなたはそれを言っている:

あなたの苦行は、次のマントラを繰り返しながら、ウェット麺と500のまつげです

$aryRange = array(); //Creates an Array 

あなたが複数の関数呼び出しの上に同じ配列を再利用する場合は、その静的変数ます:あなたのcreateDateRange機能の上部に

static $aryRange = array(); 

は、連続した呼び出しの間にそれを保持し、各呼び出しの日付を追加することができます。

+0

私は期限内にそれらの名前を変更する予定です。彼らは問題ではありません。これはwhileループの中から呼び出される関数であり、$ aryDatesは上書きされます。 –

+0

ああ、決して静的配列として設定することは考えていませんでした。すべてを修正するための1つの簡単な単語。そして、大丈夫、私は可変変数を使用しません。あなたが言っていることも私は得ます。それは乱雑です。そしてありがとう。 :) –

+0

ありがとうMarc!あなたはちょうど私に何か新しいことを教えました - 静的なキーワードが関数内でも適用できることを知らなかった...クラスのOOPコンテキストから知っていました。 – kander

関連する問題