Я пытаюсь создать массив в течение многих лет, которые я буду использовать в части года 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;
У кого-либо есть рекомендуемая идея, как работать - или как просто изменить мой существующий код?
Спасибо!
Не уверен, почему вы используете для этого сессию, но создание массива можно выполнить с помощью функции array_combine.
$years = array_combine(range(date("Y"), 1910), range(date("Y"), 1910));
Изменение параметров на range даст вам убывающий массив, а array_combine будет использовать первый массив в качестве ключей, а второй - в качестве значений, что даст array(1910 => 1910, ...);
карту, которая вам нужна.
Почему бы вам не сделать это при первом подходе
foreach($array as $k){
$string .= '<option value="'.$k.'">'.$k.'</option>'."\n";
}
Семантически и функционально, говоря, лучше использовать год как значение
, чем int
.
Также используйте метод drawonward для получения инвертированного массива, чтобы год 2010 был первым значением в вашем списке и значением по умолчанию.
Я бы выбрал вариант №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>
переверните числа в диапазоне, чтобы получить годы в порядке убывания
$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, проверки должны выполняться на стороне сервера. Если проверки выполняются на стороне сервера, можно просто предложить им простое текстовое поле.
Кроме того, выпадающий список усложняет кодирование на стороне клиента. Например, если выбраны февраль и високосный год, то раскрывающийся список дней должен содержать 29 дней, в противном случае — 28.
В варианте 1 добавьте:
$year = array_reverse( $year );
или просто используйте:
$year = range( date("Y") , 1910 );
Почему вам нужно сохранять массив в сеансе?
В зависимости от вашего варианта использования вам не нужно использовать массив для хранения данных заранее.
define('DOB_YEAR_START', 1900);
$current_year = date('Y');
for ($count = $current_year; $count >= DOB_YEAR_START; $count--)
{
print "<option value='{$count}'>{$count}</option>";
}
Если целью является просто изменение порядка массива лет на противоположное, вы можете использовать функцию array_reverse ()
.
часть 2:
$years = array();
for($i = 1900;$i<= 2010;$i++)
$years["$i"] = $i;