我正在尝试创建一个多年的数组,我将在我正在构建的表单的DOB年份中使用它。目前,我知道有两种方法可以解决这个问题,但我并不关心:
我知道我可以使用以下
创建年份数组<?php
$year = range(1910,date("Y"));
$_SESSION['years_arr'] = $year;
?>
第1点的问题有两个方面:a)我的函数调用将第一年显示为“选定”而不是“年”,因为我有选项=“0”,并且b)我希望年份逆转所以2010年是第一个,并且显示出下降。
我的函数调用是:
PHP
<?php
function showOptionsDrop($array, $active, $echo=true){
$string = '';
foreach($array as $k => $v){
$s = ($active == $k)? ' selected="selected"' : '';
$string .= '<option value="'.$k.'"'.$s.'>'.$v.'</option>'."\n";
}
if($echo) echo $string;
else return $string;
}
?>
HTML
<table>
<tr>
<td>State:</td>
<td><select name="F1State"><option value="0">Choose a year</option><?php showOptionsDrop($_SESSION['years_arr'], null, true); ?></select>
</td>
</tr>
</table>
我知道我可以在物理上创建一个列出多年的阵列,但是如果我想回去修改它会占用大量的空间和时间。
例如: PHP
$years = array('1900'=>"1900", '1901'=>"1901", '1902'=>"1902", '1903'=>"1903", '1904'=>"1904", '1905'=>"1905", '1906'=>"1906", '1907'=>"1907", '1908'=>"1908", '1909'=>"1909", '1910'=>"1910", '1911'=>"1911", '1912'=>"1912", '1913'=>"1913", '1914'=>"1914", '1915'=>"1915", '1916'=>"1916", '1917'=>"1917", '1918'=>"1918", '1919'=>"1919", '1920'=>"1920", '1921'=>"1921", '1922'=>"1922", '1923'=>"1923", '1924'=>"1924", '1925'=>"1925", '1926'=>"1926", '1927'=>"1927", '1928'=>"1928", '1929'=>"1929", '1930'=>"1930", '1931'=>"1931", '1932'=>"1932", '1933'=>"1933", '1934'=>"1934", '1935'=>"1935", '1936'=>"1936", '1937'=>"1937", '1938'=>"1938", '1939'=>"1939", '1940'=>"1940", '1941'=>"1941", '1942'=>"1942", '1943'=>"1943", '1944'=>"1944", '1945'=>"1945", '1946'=>"1946", '1947'=>"1947", '1948'=>"1948", '1949'=>"1949", '1950'=>"1950", '1951'=>"1951", '1952'=>"1952", '1953'=>"1953", '1954'=>"1954", '1955'=>"1955", '1956'=>"1956", '1957'=>"1957", '1958'=>"1958", '1959'=>"1959", '1960'=>"1960", '1961'=>"1961", '1962'=>"1962", '1963'=>"1963", '1964'=>"1964", '1965'=>"1965", '1966'=>"1966", '1967'=>"1967", '1968'=>"1968", '1969'=>"1969", '1970'=>"1970", '1971'=>"1971", '1972'=>"1972", '1973'=>"1973", '1974'=>"1974", '1975'=>"1975", '1976'=>"1976", '1977'=>"1977", '1978'=>"1978", '1979'=>"1979", '1980'=>"1980", '1981'=>"1981", '1982'=>"1982", '1983'=>"1983", '1984'=>"1984", '1985'=>"1985", '1986'=>"1986", '1987'=>"1987", '1988'=>"1988", '1989'=>"1989", '1990'=>"1990", '1991'=>"1991", '1992'=>"1992", '1993'=>"1993", '1994'=>"1994", '1995'=>"1995", '1996'=>"1996", '1997'=>"1997", '1998'=>"1998", '1999'=>"1999", '2000'=>"2000", '2001'=>"2001", '2002'=>"2002", '2003'=>"2003", '2004'=>"2004", '2005'=>"2005", '2006'=>"2006", '2007'=>"2007", '2008'=>"2008", '2009'=>"2009", '2010'=>"2010");
$_SESSION['years_arr'] = $years_arr;
是否有人建议如何工作 - 或者只是如何简单地修改现有代码?
谢谢!
答案 0 :(得分:49)
不确定为什么要使用会话,但可以使用array_combine函数生成数组。
$years = array_combine(range(date("Y"), 1910), range(date("Y"), 1910));
将参数反转为range会给你一个降序数组,array_combine将使用第一个数组作为键,第二个数组作为值,给出你所追求的array(1910 => 1910, ...);
地图。
答案 1 :(得分:19)
将范围内的数字反转,以降序显示年份
$years = range(2010, 1900); // => [2010, 2009, 2008, ... ]
使用日期('Y')而不是硬编码当前年份
$years = range(date('Y'), 1900);
在开头附加一个选项“选择年份”
array_unshift($years, "Select year");
最后为什么要选择一年或者出生日期的选择下拉菜单?它可能很普遍,但它太刺激了。一个带有验证的简单文本框,比如 dd / mm / yyyy 或 mm / dd / yyyy 更好。具有日期,月份和年份的下拉列表仅意味着允许用户选择有效值,如果他们发现只是输入日期,则不一定是正确的值。此外,由于用户仍然可以通过修改DOM来输入垃圾值,因此需要在服务器端进行验证。如果在服务器端进行验证,也可以只为它们提供一个简单的文本框。
同样下拉使客户端编码变得复杂。例如,如果选择了2月和闰年,则日期下拉列表应包含29天,否则为28天。
答案 2 :(得分:2)
为什么需要将数组存储到会话中?
根据您的使用案例,您无需事先使用数组存储数据。
define('DOB_YEAR_START', 1900);
$current_year = date('Y');
for ($count = $current_year; $count >= DOB_YEAR_START; $count--)
{
print "<option value='{$count}'>{$count}</option>";
}
答案 3 :(得分:1)
为什么不在第一种方法中这样做
foreach($array as $k){
$string .= '<option value="'.$k.'">'.$k.'</option>'."\n";
}
从语义和功能上讲,最好将年份用作value
而不是int
。
此外,使用drawnonward方法获取反转数组,以便2010年是列表中的第一个和默认值。
答案 4 :(得分:0)
在选项1中添加:
$year = array_reverse( $year );
或只是使用:
$year = range( date("Y") , 1910 );
答案 5 :(得分:0)
如果只是颠倒年份数组的顺序,则可以使用array_reverse()
函数。
答案 6 :(得分:0)
第2部分:
$years = array();
for($i = 1900;$i<= 2010;$i++)
$years["$i"] = $i;
答案 7 :(得分:0)
我选择#1选项。但是,您需要做的就是在打印之前为数组添加一个值:
<?php
$years = $_SESSION['years_arr'];
// reverse the year list
rsort($years);
// prepend the 'choose a year' value to the array
array_unshift($years, 'Choose a year');
?>
<td><select name="F1State"><?php showOptionsDrop($years, null, true); ?></select>
答案 8 :(得分:0)
你可以简单地使用PHP foreach()函数!
示例:
$years_now = date("Y");
echo '<select name="y">';
echo '<option value="" disabled>Now:</option>';
echo '<option value="'.$years_now.'" selected="selected">'.$years_now.'</option>';
echo '<option value="" disabled>Other:</option>';
foreach (range($years_now, 1910) as $years) {
echo '<option value="'.$years.'">'.$years.'</option>';
}
echo '</select>';
答案 9 :(得分:0)
扩展Brenton Alker的答案;如果你需要在数组的开头添加一些东西,你可以这样做:
$keys = array_merge(['any'], range(date("Y"), 1910));
$values = array_merge(['Any'], range(date("Y"), 1910));
$choice = array_combine($keys, $values);
这会将任何/ Any的键/值添加到数组的开头,同时保留所有后续键