Php 在“选择选项”中显示周
我已经有了这样的选择选项:Php 在“选择选项”中显示周,php,html,Php,Html,我已经有了这样的选择选项: <?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) {
<?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 .'  ' ?>
</option>
<?php
}
echo '</select> months <br />';
?>
0 // 0month
1 week
2 weeks
3 weeks
4 weeks
1 month
1 month and 1 week
1 month and 2 weeks
.....
24 months
但对于用户来说,它看起来不太好。所以我想要的是让他们像这样:
<?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 .'  ' ?>
</option>
<?php
}
echo '</select> months <br />';
?>
0 // 0month
1 week
2 weeks
3 weeks
4 weeks
1 month
1 month and 1 week
1 month and 2 weeks
.....
24 months
这并不是我最后的愿望,但我希望是那样的
这可能吗?实际上,在for循环中,可以使用一些简单的算法和内置函数来分解$i的值。也许你可以做如下的事情:
$months = intval($i);
$weeks = ($i - floatval($months)) / .25;
echo "{$months} month(s) and {$weeks} week(s)";
然后将这些步骤中的任何一个映射到特定的数字:
$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";
$list=范围(0,96);
$selected=12;//$_会话[“年龄”]
回显“年龄:\n\n”;
foreach($列为$value)
{
$label=$map($value);
printf(“%s\n”,$value,$value====$selected?“selected='selected'”:$label);
}
回音“\n”;
这将为您提供输出():
年龄:
1周
2周
3周
1个月
...
2个月零3周
3个月
3个月1周
...
12个月零2周
12个月零3周
13个月
13个月1周
13个月零2周
...
23个月
23个月零1周
23个月零2周
23个月零3周
24个月
forloop出现这种奇怪的for
loop有什么特别的原因吗?使用嵌套循环,所以每个月都有一个循环来增加3周。是的,这是我的梦想,但我做不到。你只给出了变量,哪一个将循环,以及如何实现。你的意思是你的代码中的/0.25
?它的目的是在你已经拥有的for循环中使用块(使用for循环中的$i)。我认为你不需要0.25中的0,但我可能错了。我不能再投票了:(,我们必须要求这样才能允许向上投票两次:)只有一件事@hakre,我希望得到像我所做的那样的值0,0.25,0,50…
而不是像那样0,96
请参见第一个映射函数示例以获得提示:$step*0.25
:)-但是您应该在这里使用整数。保持简单。@hakre,我不知道把$step*0.25
放在哪里,你的代码是高级专家:),你能编辑你的演示链接来解决我的问题吗?我已经尝试了$list=range(0,24,0.25)但是它的结果是错误的。
$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";
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>