Массив 'лет' PHP

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

1) Диапазон:

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

<?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>

2) Долгий массив

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

исключая: 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;

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

Спасибо!

22
задан wattostudios 30 April 2012 в 13:44
поделиться

8 ответов

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

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

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

53
ответ дан 29 November 2019 в 03:29
поделиться

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

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

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

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

1
ответ дан 29 November 2019 в 03:29
поделиться

Я бы выбрал вариант №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>
0
ответ дан 29 November 2019 в 03:29
поделиться

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

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

22
ответ дан 29 November 2019 в 03:29
поделиться

В варианте 1 добавьте:

$year = array_reverse( $year );

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

$year = range( date("Y") , 1910 );
0
ответ дан 29 November 2019 в 03:29
поделиться

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

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

define('DOB_YEAR_START', 1900);

$current_year = date('Y');

for ($count = $current_year; $count >= DOB_YEAR_START; $count--)
{
    print "<option value='{$count}'>{$count}</option>";
}
2
ответ дан 29 November 2019 в 03:29
поделиться

Если целью является просто изменение порядка массива лет на противоположное, вы можете использовать функцию array_reverse () .

http://www.php.net/manual/en/function.array-reverse.php

0
ответ дан 29 November 2019 в 03:29
поделиться

часть 2:

$years = array();
for($i = 1900;$i<= 2010;$i++)
    $years["$i"] = $i;
0
ответ дан 29 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: