PHP 'Yıllar' dizisi

8 Cevap php

Ben i inşa ediyorum bir form DOB yıl parça kullanacak yıldır bir dizi oluşturmak için çalışıyorum. Şu anda, sorunu ele ama ben de gerçekten umurumda değil iki yolu vardır biliyorum:

1) Range:

Ben şu kullanarak bir yıl dizi oluşturabilirsiniz biliyorum

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

Nokta 1 ile sorun iki yönlüdür: a) benim işlevi çağrısı gibi option = "0" Ben gibi yerine "Yıl" 'seçilen' olarak ilk yılını gösterir, ve b) bu ​​yüzden 2010 ilk yıl geri istiyorum en az ve azalan gösterilmiştir.

Benim işlev çağrısı:

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) Long Array

Ben fiziksel olarak listelenmiş yıl ile bir dizi oluşturabilirsiniz biliyorum ama ben hiç geri gitmek ve değiştirmek istiyorsanız bu mekan ve çok zaman alır.

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;

Ya da ne kadar sadece benim mevcut kodunu değiştirmek için - herkes nasıl çalışmak için önerilen bir fikir var mı?

Teşekkür ederiz!

8 Cevap

Bunun için oturumu kullanan, ancak dizi array_combine fonksiyonu ile yapılabilir üreten konum neden emin değil.

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

Parametreleri tersine range Sana inen bir dizi verecek ve array_combine array(1910 => 1910, ...); sonra konum Haritayı vererek, anahtarlar ve değerler gibi ikinci olarak birinci dizi kullanır.

azalan yıllar alır aralığında numaraları ters

$years = range(2010, 1900); // => [2010, 2009, 2008, ... ]

yerine cari yıl sabit kodlama tarihini ('Y') kullanın

$years = range(date('Y'), 1900);

başında bir seçenek "Select yıl" append

array_unshift($years, "Select year");

Ve nihayet neden hiç doğum yıl ya da tarih için bir seçme damla aşağı var? Bu yaygın olabilir ama süper rahatsız edici. Doğrulamaları ile basit bir metin kutusu, dd/mm/yyyy veya mm/dd/yyyy gibi bir şey daha iyi. Tarih, ay ve yıl açılan çıkışlar olması sadece bir kullanıcı bunu girişine sadece bir tarih kıvrık bulursanız geçerli değerler ve mutlaka doğru değildir değerleri seçmek için izin anlamına gelir. Kullanıcılar hala DOM değiştirerek önemsiz değerler girebilirsiniz Dahası, doğrulamaları sunucu tarafında yapılması gerekir. Doğrulamaları sunucu tarafında yapılıyor ise, hem de sadece onlara basit bir metin kutusu sunabilir.

Ayrıca damla-çıkışlar istemci tarafı kodlama kompleksi yapmak. Şubat ve bir yılda seçilir Örneğin, daha sonra bir gün açılır, aksi takdirde 28 29 gün içermelidir.

Neden ilk yaklaşım bunu yapmayın

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

Anlamsal ve işlevsel, konuşma o value bir int daha fazla olarak yıllık kullanmak daha iyidir.

2010 yılı listenizde ilk ve varsayılan değer bu yüzden de, ters bir dizisini almak için yöntem drawnonward kullanın.

Neden oturumuna dizisini saklamak gerekiyor?

Kullanımı durumda dayanarak, önceden veri depolamak için dizi kullanmak gerekmez.

define('DOB_YEAR_START', 1900);

$current_year = date('Y');

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

Seçenek 1 add in:

$year = array_reverse( $year );

ya da sadece kullanın:

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

Sadece yıl dizinin sırasını tersine size array_reverse() işlevini kullanabilirsiniz hedefi ise.

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

part 2:

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

Ben seçeneği # 1 ile gitmek istiyorum. Yazdırmadan önce Ancak yapmanız gereken tüm dizisine bir değer Önlerine edilir:

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