2

私はすでに次のような選択オプションを持っています:

<?php
    echo 'Age : <select id="age" name ="age" class="selecta">';
    for($i = 0; $i <= 24; $i += 0.25) 
    { 
?>
    <option value="<?php echo $i ;?>" 
    <?php
    if ($_SESSION['age'] == $i) 
    { 
        echo " selected='selected'"; 
    } 
    ?> > 
    <?php echo $i .'&nbsp&nbsp' ?>
    </option>  
    <?php 
    }
    echo '</select> months <br />';
?>

これはうまく機能し、これを表示します:

  0           // means 0 month
  0.25        // means 1 week   or  0.25 of month
  0.50        // means 2 weeks  or half month
  0.75
  1           // means 1 month
  1.25
  ....
  24

しかし、ユーザーにとってはあまり良くありません。だから私が欲しいのは、それらを次のようにすることです:

0      // 0month
1 week  
2 weeks
3 weeks
4 weeks  
1 month
1 month and 1 week
1 month and 2 weeks
.....
24 months

まさにそのようになりたいというのが私の最終的な願望ではありませんが、私はそのようになりたいと思っています.

これは可能ですか?

4

2 に答える 2

2
for($i = 0; $i <= 24; $i += 0.25) { 

ここでは、97 回の反復のシーケンスがあります。それは等しく

range(0, 96);

次に、これらのステップのいずれかを特定の番号にマップします。

$map = function($step) {
    return $step * 0.25;
}

たとえば、次のシーケンスが作成されます。

0, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, ... , 23, 23.25, 23.5, 23.75, 24

したがって、これらの数字ではなく、良い月だけが必要です。ステップ(小数の代わりに)をより簡単に実行すれば、それらを計算できます。

month: floor($step / 4)   - division (integer)
weeks: $step % 4          - modulo   (integer)

または、それをテキストに変換するマッピング関数として:

$map = function ($step) {
    $month = floor($step / 4);
    $week  = $step % 4;

    $buffer = '';

    if ($month) {
        $buffer .= "$month month";
    }

    if ($week) {
        if ($month) {
            $buffer .= ' and ';
        }

        $buffer .=  "$week week" . ($week == 1 ? '' : 's');
    }

    return $buffer;
};

例えば:

$map(0)   # (empty)
$map(1)   # 1 week
$map(10)  # 2 month and 3 weeks
$map(95)  # 23 month and 3 weeks
$map(96)  # 24 month

したがって、範囲をキーとして値にマップするだけで、これらの値を使用して選択ボックスの標準出力を実行できます。

$list = range(0, 96);

$selected = 12; // $_SESSION['age']

echo "Age : \n<select id='age' name ='age' class='selecta'>\n";
foreach ($list as $value)
{
    $label = $map($value);
    printf("  <option value='%d'%s>%s</option>\n", $value, $value === $selected ? " selected='selected'" : '', $label);
}
echo "</select>\n";

これにより、出力が得られます(Demo):

Age : 
<select id='age' name ='age' class='selecta'>
  <option value='0'></option>
  <option value='1'>1 week</option>
  <option value='2'>2 weeks</option>
  <option value='3'>3 weeks</option>
  <option value='4'>1 month</option>
  ...
  <option value='11'>2 month and 3 weeks</option>
  <option value='12' selected='selected'>3 month</option>
  <option value='13'>3 month and 1 week</option>
  ...
  <option value='50'>12 month and 2 weeks</option>
  <option value='51'>12 month and 3 weeks</option>
  <option value='52'>13 month</option>
  <option value='53'>13 month and 1 week</option>
  <option value='54'>13 month and 2 weeks</option>
  ...
  <option value='92'>23 month</option>
  <option value='93'>23 month and 1 week</option>
  <option value='94'>23 month and 2 weeks</option>
  <option value='95'>23 month and 3 weeks</option>
  <option value='96'>24 month</option>
</select>
于 2012-12-21T23:56:40.093 に答える
0

for ループ内で $i の値を分解するために実行できる単純な算術関数と組み込み関数がいくつかあります。多分あなたは次のようなことをすることができます:

$months = intval($i);
$weeks = ($i - floatval($months)) / .25;
echo "{$months} month(s) and {$weeks} week(s)";
于 2012-12-21T23:49:11.627 に答える