Подтвердить что ты не робот

PHP 'Years' массив

Я пытаюсь создать массив в течение многих лет, который я буду использовать в куске формы DOB, который я создаю. В настоящее время я знаю, что есть два способа решить проблему, но мне тоже не важно:

1) Диапазон:

Я знаю, что могу создать массив года, используя следующие

<?php 
     $year = range(1910,date("Y"));
     $_SESSION['years_arr'] = $year;
?>

проблема с точкой 1 выполняется в два раза: а) мой вызов функции показывает первый год как "выбранный" вместо "Год", поскольку у меня есть опция = "0", и б) я хочу, чтобы годы были отменены, поэтому 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>

2) Длинный массив

Я знаю, что могу физически создавать массив с годами, но это занимает много места и времени, если я когда-либо захочу вернуться и изменить.

ex: 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;

Есть ли у кого-нибудь рекомендуемая идея, как работать, или просто изменить мой существующий код?

Спасибо!

4b9b3361

Ответ 1

Не уверен, почему вы используете сеанс для этого, но генерация массива может быть выполнена с помощью функции array_combine.

$years = array_combine(range(date("Y"), 1910), range(date("Y"), 1910));

Отмена параметров range даст вам нисходящий массив, а array_combine будет использовать первый массив в качестве ключей, а второй - как значения, дающие вам карту array(1910 => 1910, ...);.

Ответ 2

отмените числа в диапазоне, чтобы получить годы в порядке убывания.

$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.

Ответ 3

Зачем вам нужно хранить массив в сеансе?

На основе вашего варианта использования вам не нужно заранее использовать массив для хранения данных.

define('DOB_YEAR_START', 1900);

$current_year = date('Y');

for ($count = $current_year; $count >= DOB_YEAR_START; $count--)
{
    print "<option value='{$count}'>{$count}</option>";
}

Ответ 4

Почему бы вам не сделать это при первом подходе

    foreach($array as $k){
        $string .= '<option value="'.$k.'">'.$k.'</option>'."\n";     
    }

Семантически и функционально говоря, лучше использовать год как value, чем a int.

Кроме того, используйте метод drawonward для получения инвертированного массива, так что 2010 год является первым и значением по умолчанию в вашем списке.

Ответ 5

В опции 1 добавьте:

$year = array_reverse( $year );

или просто используйте:

$year = range( date("Y") , 1910 );

Ответ 7

часть 2:

$years = array();
for($i = 1900;$i<= 2010;$i++)
    $years["$i"] = $i;

Ответ 8

Я бы выбрал вариант # 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>

Ответ 9

вы можете просто использовать функцию 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>';