2016-09-19 11 views
0

私は長年にわたってフィールドを持つMySQLデータベーステーブルを持っています。このテーブルの例は、次のようになります。指定した日付に基づいて日付範囲セレクタを作成します

registration_date | 
------------------ 
1965 
1972 
1984 
1997 
1963 

物のフロントエンド側では、ユーザーは年の範囲のドロップダウンから選択できます。すなわち

1961-1965 
1966-1970 
1971-1975 

私のデータベースから利用可能なデータに基づいてこの範囲の日付を生成する最も効果的な方法は何ですか?

$row = //year available 
while(((int) substr($row, -1)) !== 0) { 
$start_date = $row--; 
} 

while(((int) substr($row, -1)) !== 6) { 
$end_date = $row++; 
} 

を、それが実行に時間がかかりすぎると、残念ながらこれはただのハング:

私が試してみました。

+0

私は、データベースからのデータの多くを引き出している参照してください。 SQLを使用してデータベースから必要なデータを準備する必要があります。そして、日付があるときは、phpを使って日付を印刷することができます。 – vishwakarma09

+0

単日付を返すのではなく、SQLを使用して日付範囲を作成するにはどうすればよいですか? @ vishwakarma09 –

+0

registration_dateの重複のために処理が遅くなる可能性があります。値が一意であるかどうかを確認してください。 1900年から2016年の間でさえ比較的小さい配列である。 – Axidepuy

答えて

0

データベースregistration_dateから最小値と最大値を見つけるには、min(),max()関数を使用する必要があります。 私はMINMAXを見つけるためにあなたのクエリーに適用する必要がある同じPHP関数としてここで使用しました。 同じ例をarrayで提供します。

<?php 
$resArr = Array(1965,1972,1984,1997,1963); 
$max = max($resArr); 
$min = min($resArr); 
$diff = (($max - $min)/5) + 1; 
while($max % 5 != 0) 
{ 
    $max++; 
} 
while($min % 5 != 0) 
{ 
    $min--; 
} 

for($i=0;$i<$diff;$i++) 
{ 
    $start = $min+1; 
    $end = $min+5; 
    $range = $start."-".$end; 
    $rangeArr[] = $range; 
    $min = $min+5; 
} 

foreach($rangeArr as $row) 
{ 
    $flag = 0; 
    $tmpArr = explode("-", $row); 
    foreach($resArr as $val) 
    { 
     if($val>=$tmpArr[0] && $val<=$tmpArr[1]) 
     { 
      $flag = 1; 
     } 
    } 

    if($flag) 
    { 
     $newArr[] = $row; 
    } 
} 

echo "Final Array"; 
print_r($newArr); 

出力

Array 
(
    [0] => 1961-1965 
    [1] => 1971-1975 
    [2] => 1981-1985 
    [3] => 1996-2000 
) 

オンラインデモ:Click Here

+0

上記のコードを確認すると、必ずあなたを助けます。 @Humphrey Wilkins – RJParikh

+0

1975年から1980年の間に '$ resArr'配列に日付はありませんが、' $ rangeArr'にはまだ存在しますが、それでも問題があるかどうかはわかりません。 – Axidepuy

+0

ユーザーは、テーブルに含まれていない範囲を削除するように指定していません。しかし、 'in_array()'関数を使ってそれを管理することもできます。 @Axidepuy – RJParikh

関連する問題