จะสร้างวงวนสำหรับเมนูแบบเลื่อนลงนี้ได้อย่างไร?

และการวนซ้ำจะมีประสิทธิภาพมากกว่าหากแยกพวกมันออกทีละรายการหรือไม่?

<select name="birthdayYear" >
    <option value="0000"<?php echo $birthdayYear == '0000' ? 'selected="selected"' : ''; ?>>Year:</option>
    <option value="2011"<?php echo $birthdayYear == '2011' ? 'selected="selected"' : ''; ?>>2011</option>
    <option value="2010"<?php echo $birthdayYear == '2010' ? 'selected="selected"' : ''; ?>>2010</option>
    <option value="2009"<?php echo $birthdayYear == '2009' ? 'selected="selected"' : ''; ?>>2009</option>
    <option value="2008"<?php echo $birthdayYear == '2008' ? 'selected="selected"' : ''; ?>>2008</option>
    <option value="2007"<?php echo $birthdayYear == '2007' ? 'selected="selected"' : ''; ?>>2007</option>
    <option value="2006"<?php echo $birthdayYear == '2006' ? 'selected="selected"' : ''; ?>>2006</option>
    <option value="2005"<?php echo $birthdayYear == '2005' ? 'selected="selected"' : ''; ?>>2005</option>
    <option value="2004"<?php echo $birthdayYear == '2004' ? 'selected="selected"' : ''; ?>>2004</option>
    <option value="2003"<?php echo $birthdayYear == '2003' ? 'selected="selected"' : ''; ?>>2003</option>
    <option value="2002"<?php echo $birthdayYear == '2002' ? 'selected="selected"' : ''; ?>>2002</option>
    <option value="2001"<?php echo $birthdayYear == '2001' ? 'selected="selected"' : ''; ?>>2001</option>
    <option value="2000"<?php echo $birthdayYear == '2000' ? 'selected="selected"' : ''; ?>>2000</option>
    <option value="1999"<?php echo $birthdayYear == '1999' ? 'selected="selected"' : ''; ?>>1999</option>
    <option value="1998"<?php echo $birthdayYear == '1998' ? 'selected="selected"' : ''; ?>>1998</option>
    <option value="1997"<?php echo $birthdayYear == '1997' ? 'selected="selected"' : ''; ?>>1997</option>
    <option value="1996"<?php echo $birthdayYear == '1996' ? 'selected="selected"' : ''; ?>>1996</option>
    <option value="1995"<?php echo $birthdayYear == '1995' ? 'selected="selected"' : ''; ?>>1995</option>
    <option value="1994"<?php echo $birthdayYear == '1994' ? 'selected="selected"' : ''; ?>>1994</option>
    <option value="1993"<?php echo $birthdayYear == '1993' ? 'selected="selected"' : ''; ?>>1993</option>
    <option value="1992"<?php echo $birthdayYear == '1992' ? 'selected="selected"' : ''; ?>>1992</option>
    <option value="1991"<?php echo $birthdayYear == '1991' ? 'selected="selected"' : ''; ?>>1991</option>
    <option value="1990"<?php echo $birthdayYear == '1990' ? 'selected="selected"' : ''; ?>>1990</option>
    <option value="1989"<?php echo $birthdayYear == '1989' ? 'selected="selected"' : ''; ?>>1989</option>
    <option value="1988"<?php echo $birthdayYear == '1988' ? 'selected="selected"' : ''; ?>>1988</option>
    <option value="1987"<?php echo $birthdayYear == '1987' ? 'selected="selected"' : ''; ?>>1987</option>
    <option value="1986"<?php echo $birthdayYear == '1986' ? 'selected="selected"' : ''; ?>>1986</option>
    <option value="1985"<?php echo $birthdayYear == '1985' ? 'selected="selected"' : ''; ?>>1985</option>
    <option value="1984"<?php echo $birthdayYear == '1984' ? 'selected="selected"' : ''; ?>>1984</option>
    <option value="1983"<?php echo $birthdayYear == '1983' ? 'selected="selected"' : ''; ?>>1983</option>
    <option value="1982"<?php echo $birthdayYear == '1982' ? 'selected="selected"' : ''; ?>>1982</option>
    <option value="1981"<?php echo $birthdayYear == '1981' ? 'selected="selected"' : ''; ?>>1981</option>
    <option value="1980"<?php echo $birthdayYear == '1980' ? 'selected="selected"' : ''; ?>>1980</option>
    <option value="1979"<?php echo $birthdayYear == '1979' ? 'selected="selected"' : ''; ?>>1979</option>
    <option value="1978"<?php echo $birthdayYear == '1978' ? 'selected="selected"' : ''; ?>>1978</option>
    <option value="1977"<?php echo $birthdayYear == '1977' ? 'selected="selected"' : ''; ?>>1977</option>
    <option value="1976"<?php echo $birthdayYear == '1976' ? 'selected="selected"' : ''; ?>>1976</option>
    <option value="1975"<?php echo $birthdayYear == '1975' ? 'selected="selected"' : ''; ?>>1975</option>
    <option value="1974"<?php echo $birthdayYear == '1974' ? 'selected="selected"' : ''; ?>>1974</option>
    <option value="1973"<?php echo $birthdayYear == '1973' ? 'selected="selected"' : ''; ?>>1973</option>
    <option value="1972"<?php echo $birthdayYear == '1972' ? 'selected="selected"' : ''; ?>>1972</option>
    <option value="1971"<?php echo $birthdayYear == '1971' ? 'selected="selected"' : ''; ?>>1971</option>
    <option value="1970"<?php echo $birthdayYear == '1970' ? 'selected="selected"' : ''; ?>>1970</option>
    <option value="1969"<?php echo $birthdayYear == '1969' ? 'selected="selected"' : ''; ?>>1969</option>
    <option value="1968"<?php echo $birthdayYear == '1968' ? 'selected="selected"' : ''; ?>>1968</option>
    <option value="1967"<?php echo $birthdayYear == '1967' ? 'selected="selected"' : ''; ?>>1967</option>
    <option value="1966"<?php echo $birthdayYear == '1966' ? 'selected="selected"' : ''; ?>>1966</option>
    <option value="1965"<?php echo $birthdayYear == '1965' ? 'selected="selected"' : ''; ?>>1965</option>
    <option value="1964"<?php echo $birthdayYear == '1964' ? 'selected="selected"' : ''; ?>>1964</option>
    <option value="1963"<?php echo $birthdayYear == '1963' ? 'selected="selected"' : ''; ?>>1963</option>
    <option value="1962"<?php echo $birthdayYear == '1962' ? 'selected="selected"' : ''; ?>>1962</option>
    <option value="1961"<?php echo $birthdayYear == '1961' ? 'selected="selected"' : ''; ?>>1961</option>
    <option value="1960"<?php echo $birthdayYear == '1960' ? 'selected="selected"' : ''; ?>>1960</option>
    <option value="1959"<?php echo $birthdayYear == '1959' ? 'selected="selected"' : ''; ?>>1959</option>
    <option value="1958"<?php echo $birthdayYear == '1958' ? 'selected="selected"' : ''; ?>>1958</option>
    <option value="1957"<?php echo $birthdayYear == '1957' ? 'selected="selected"' : ''; ?>>1957</option>
    <option value="1956"<?php echo $birthdayYear == '1956' ? 'selected="selected"' : ''; ?>>1956</option>
    <option value="1955"<?php echo $birthdayYear == '1955' ? 'selected="selected"' : ''; ?>>1955</option>
    <option value="1954"<?php echo $birthdayYear == '1954' ? 'selected="selected"' : ''; ?>>1954</option>
    <option value="1953"<?php echo $birthdayYear == '1953' ? 'selected="selected"' : ''; ?>>1953</option>
    <option value="1952"<?php echo $birthdayYear == '1952' ? 'selected="selected"' : ''; ?>>1952</option>
    <option value="1951"<?php echo $birthdayYear == '1951' ? 'selected="selected"' : ''; ?>>1951</option>
    <option value="1950"<?php echo $birthdayYear == '1950' ? 'selected="selected"' : ''; ?>>1950</option>
    <option value="1949"<?php echo $birthdayYear == '1949' ? 'selected="selected"' : ''; ?>>1949</option>
    <option value="1948"<?php echo $birthdayYear == '1948' ? 'selected="selected"' : ''; ?>>1948</option>
    <option value="1947"<?php echo $birthdayYear == '1947' ? 'selected="selected"' : ''; ?>>1947</option>
    <option value="1946"<?php echo $birthdayYear == '1946' ? 'selected="selected"' : ''; ?>>1946</option>
    <option value="1945"<?php echo $birthdayYear == '1945' ? 'selected="selected"' : ''; ?>>1945</option>
    <option value="1944"<?php echo $birthdayYear == '1944' ? 'selected="selected"' : ''; ?>>1944</option>
    <option value="1943"<?php echo $birthdayYear == '1943' ? 'selected="selected"' : ''; ?>>1943</option>
    <option value="1942"<?php echo $birthdayYear == '1942' ? 'selected="selected"' : ''; ?>>1942</option>
    <option value="1941"<?php echo $birthdayYear == '1941' ? 'selected="selected"' : ''; ?>>1941</option>
    <option value="1940"<?php echo $birthdayYear == '1940' ? 'selected="selected"' : ''; ?>>1940</option>
    <option value="1939"<?php echo $birthdayYear == '1939' ? 'selected="selected"' : ''; ?>>1939</option>
    <option value="1938"<?php echo $birthdayYear == '1938' ? 'selected="selected"' : ''; ?>>1938</option>
    <option value="1937"<?php echo $birthdayYear == '1937' ? 'selected="selected"' : ''; ?>>1937</option>
    <option value="1936"<?php echo $birthdayYear == '1936' ? 'selected="selected"' : ''; ?>>1936</option>
    <option value="1935"<?php echo $birthdayYear == '1935' ? 'selected="selected"' : ''; ?>>1935</option>
    <option value="1934"<?php echo $birthdayYear == '1934' ? 'selected="selected"' : ''; ?>>1934</option>
    <option value="1933"<?php echo $birthdayYear == '1933' ? 'selected="selected"' : ''; ?>>1933</option>
    <option value="1932"<?php echo $birthdayYear == '1932' ? 'selected="selected"' : ''; ?>>1932</option>
    <option value="1931"<?php echo $birthdayYear == '1931' ? 'selected="selected"' : ''; ?>>1931</option>
    <option value="1930"<?php echo $birthdayYear == '1930' ? 'selected="selected"' : ''; ?>>1930</option>
    <option value="1929"<?php echo $birthdayYear == '1929' ? 'selected="selected"' : ''; ?>>1929</option>
    <option value="1928"<?php echo $birthdayYear == '1928' ? 'selected="selected"' : ''; ?>>1928</option>
    <option value="1927"<?php echo $birthdayYear == '1927' ? 'selected="selected"' : ''; ?>>1927</option>
    <option value="1926"<?php echo $birthdayYear == '1926' ? 'selected="selected"' : ''; ?>>1926</option>
    <option value="1925"<?php echo $birthdayYear == '1925' ? 'selected="selected"' : ''; ?>>1925</option>
    <option value="1924"<?php echo $birthdayYear == '1924' ? 'selected="selected"' : ''; ?>>1924</option>
    <option value="1923"<?php echo $birthdayYear == '1923' ? 'selected="selected"' : ''; ?>>1923</option>
    <option value="1922"<?php echo $birthdayYear == '1922' ? 'selected="selected"' : ''; ?>>1922</option>
    <option value="1921"<?php echo $birthdayYear == '1921' ? 'selected="selected"' : ''; ?>>1921</option>
    <option value="1920"<?php echo $birthdayYear == '1920' ? 'selected="selected"' : ''; ?>>1920</option>
    <option value="1919"<?php echo $birthdayYear == '1919' ? 'selected="selected"' : ''; ?>>1919</option>
    <option value="1918"<?php echo $birthdayYear == '1918' ? 'selected="selected"' : ''; ?>>1918</option>
    <option value="1917"<?php echo $birthdayYear == '1917' ? 'selected="selected"' : ''; ?>>1917</option>
    <option value="1916"<?php echo $birthdayYear == '1916' ? 'selected="selected"' : ''; ?>>1916</option>
    <option value="1915"<?php echo $birthdayYear == '1915' ? 'selected="selected"' : ''; ?>>1915</option>
    <option value="1914"<?php echo $birthdayYear == '1914' ? 'selected="selected"' : ''; ?>>1914</option>
    <option value="1913"<?php echo $birthdayYear == '1913' ? 'selected="selected"' : ''; ?>>1913</option>
    <option value="1912"<?php echo $birthdayYear == '1912' ? 'selected="selected"' : ''; ?>>1912</option>
    <option value="1911"<?php echo $birthdayYear == '1911' ? 'selected="selected"' : ''; ?>>1911</option>
    <option value="1910"<?php echo $birthdayYear == '1910' ? 'selected="selected"' : ''; ?>>1910</option>
    <option value="1909"<?php echo $birthdayYear == '1909' ? 'selected="selected"' : ''; ?>>1909</option>
    <option value="1908"<?php echo $birthdayYear == '1908' ? 'selected="selected"' : ''; ?>>1908</option>
    <option value="1907"<?php echo $birthdayYear == '1907' ? 'selected="selected"' : ''; ?>>1907</option>
    <option value="1906"<?php echo $birthdayYear == '1906' ? 'selected="selected"' : ''; ?>>1906</option>
    <option value="1905"<?php echo $birthdayYear == '1905' ? 'selected="selected"' : ''; ?>>1905</option>
    <option value="1904"<?php echo $birthdayYear == '1904' ? 'selected="selected"' : ''; ?>>1904</option>
    <option value="1903"<?php echo $birthdayYear == '1903' ? 'selected="selected"' : ''; ?>>1903</option>
    <option value="1902"<?php echo $birthdayYear == '1902' ? 'selected="selected"' : ''; ?>>1902</option>
    <option value="1901"<?php echo $birthdayYear == '1901' ? 'selected="selected"' : ''; ?>>1901</option>
    <option value="1900"<?php echo $birthdayYear == '1900' ? 'selected="selected"' : ''; ?>>1900</option>
</select>

person user784637    schedule 19.07.2011    source แหล่งที่มา
comment
และได้โปรดเถอะ สำหรับทุกสิ่งที่ศักดิ์สิทธิ์: การเลื่อนเวลาหนึ่งปีนั้นผิดธรรมดามาก ฉันไม่รู้ว่าจะเริ่มต้นจากตรงไหน   -  person tdammers    schedule 20.07.2011
comment
@tdammers คุณอยากให้เขาใช้อะไรแทน?   -  person Brad    schedule 20.07.2011
comment
จะง่ายกว่ามากหากมีช่องข้อความธรรมดาที่มีโค้ดจาวาสคริปต์ (และโค้ดฝั่งเซิร์ฟเวอร์) เล็กน้อยเพื่อกรองตัวเลขที่ไม่ใช่ตัวเลขและจำกัดช่วง เมนูแบบเลื่อนลงของวันที่เป็นสิ่งที่น่ากลัวอย่างยิ่งต่อการใช้งานและเป็นสัญญาณของการเขียนโปรแกรมที่ขี้เกียจ ฉันรู้สึกเสียใจสำหรับผู้ใช้อายุ 112 ปีที่ไม่สามารถใช้แบบฟอร์มของคุณได้...   -  person Marc B    schedule 20.07.2011
comment
โทรดี. จากเนื้อหาการใช้งานทั้งหมดที่ฉันได้อ่าน แนวคิดในการป้อนวันที่ดูเหมือนจะหายไป ข้อเสนอแนะของคุณค่อนข้างถูกต้อง และฉันจะจำไว้เพื่อใช้ในอนาคต   -  person Brad    schedule 20.07.2011
comment
@Brad: กล่องข้อความ เหตุผลทั่วไปสำหรับเมนูแบบเลื่อนลงคือ ทำให้ไม่จำเป็นต้องมีการตรวจสอบความถูกต้อง หรือบังคับให้ผู้ใช้ป้อนวันที่ที่ถูกต้อง นั่นไม่ใช่ข้อแก้ตัว เนื่องจากการตรวจสอบว่าสตริงที่กำหนดเป็นตัวเลขสี่หลักระหว่างปี 1900 ถึง 2011 นั้นเป็นแบบฝึกหัดการเขียนโปรแกรมระดับเริ่มต้น (และในความเป็นจริง สามารถทำได้ใน regex เดียว หากคุณต้องการคลั่งไคล้)   -  person tdammers    schedule 20.07.2011
comment
@tdammers ฉันเข้าใจแล้ว มันเป็นเพียงสิ่งที่ฉันไม่เคยคิดมากเกินไปมาก่อน ขอบคุณสำหรับการชี้แจง   -  person Brad    schedule 20.07.2011
comment
คุณยังสามารถใช้บางอย่างเช่น DateJS เพื่อแปลงวันที่ใดก็ได้ให้เป็นวันที่จริง ด้วยวิธีนี้ผู้ใช้สามารถป้อนในรูปแบบใดก็ได้ที่พวกเขาต้องการ   -  person Jordan    schedule 20.07.2011


คำตอบ (8)


<select name="birthdayYear" >
    <option value="0000"<?php echo $birthdayYear == '0000' ? 'selected="selected"' : ''; ?>>Year:</option>

<?php
for($i=date('Y'); $i>1899; $i--) {
    $selected = '';
    if ($birthdayYear == $i) $selected = ' selected="selected"';
    print('<option value="'.$i.'"'.$selected.'>'.$i.'</option>'."\n");
}
?>

</select>

และการวนซ้ำจะมีประสิทธิภาพมากกว่าหากแยกพวกมันออกทีละรายการหรือไม่?

ฉันไม่คิดว่าคุณต้องกังวลเกี่ยวกับประสิทธิภาพ ฉันคิดว่าการใช้ลูปดูสะอาดตามากขึ้น ฉันคิดว่าจะดูแลรักษาได้ง่ายกว่า

person PeeHaa    schedule 19.07.2011

หากไม่มีประสิทธิภาพมากขึ้น ก็สามารถอ่านและนำกลับมาใช้ซ้ำได้มากขึ้นอย่างแน่นอน ซึ่งมีความสำคัญมากกว่ามาก

<select name="birthdayYear" >
    <option value="0000">Year:</option>
    <?php
        for(var $x = year(); $x >= 1900; $x--) {
            var $selected = "";
            if($x == $birthdayYear) {
                $selected = " selected = 'selected'";
            }
            echo("<option value="$x"$selected>$x</option>");
        }
    ?>
</select>

ในระยะสั้นผมของฉันเป็นนก

person Jordan    schedule 19.07.2011
comment
อย่างไรก็ตาม คุณไม่จำเป็นต้องใส่ selected = 'selected' สำหรับตัวเลือกแรกเลย เนื่องจากตัวเลือกดังกล่าวจะถูกเลือกไว้ตามค่าเริ่มต้น - person Jordan; 20.07.2011

โดยพื้นฐานแล้ว คุณจะ:

  • จัดการกับบรรทัดเฉพาะ 0000 ด้วยตัวเอง
  • จากนั้นมี for() วนซ้ำจาก 2011 ถึง 1900

ลูปอาจมีลักษณะดังนี้:

for ($year=2011 ; $year>=1900 ; $year--) {
    echo '<option value="' . $year . '"';
    if ($year == $birthdayYear) {
        echo 'selected="selected"';
    }
    echo '>' . $year . '</option>' . PHP_EOL;
}


แน่นอนว่า ปี 2011 ไม่ควรฮาร์ดโค้ด -- ดูที่ date() สำหรับวิธีที่เป็นไปได้ในการรับปีปัจจุบัน

person Pascal MARTIN    schedule 19.07.2011

for ($x=(int)date("Y"); $x>=1900; $x=$x--) {
    echo "<option value=\"", $x, "\"", ($birthdayYear==$x) ? " selected=\"selected\"" : "", ">", $x, "</option>"
}

นี่เป็นโบนัสเพิ่มเติมที่คุณไม่ต้องอัปเดตทุกปี

person Brad    schedule 19.07.2011
comment
@PeeHaa สำหรับฉันใน PHP มันเป็นเพียงการตั้งค่า ฟังก์ชัน date() จะส่งคืนสตริงเสมอ แม้ว่า PHP จะจัดการมันให้คุณ แต่ฉันก็อยากจะชัดเจน - person Brad; 20.07.2011
comment
@k. ขอบคุณสำหรับคำอธิบาย ฉันคิดว่าฉันพลาดบางสิ่งบางอย่าง - person PeeHaa; 20.07.2011

ลองสิ่งนี้:

<select name="birthdayYear" >
<?php
if($year == '0000') {
    echo '<option value="0000" selected="selected">0000</option>';
} else {
    echo '<option value="0000">0000</option>';
}
for($year = intval(date('Y')); $year > 1900; $year --) {
    if($year == $birthdayYear) {
        echo '<option value="'.$year.'" selected="selected">'.$year.'</option>';
    } else {
        echo '<option value="'.$year.'">'.$year.'</option>';
    }
}
?>
</select>
person Anthony Simmon    schedule 19.07.2011

ขั้นแรก ให้ส่งออกตัวเลือก '0000' ไม่เป็นไปตามรูปแบบ ดังนั้นจึงไม่ควรรวมไว้ในลูป:

<option value="0000"<?php echo $birthdayYear == '0000' ? 'selected="selected"' : ''; ?>>Year:</option>

จากนั้น สร้างลูปและส่งออกแต่ละส่วนของตัวเลือก ฉันเริ่มต้นด้วย date('Y') (ปีปัจจุบัน) แทนที่จะเป็นแบบฮาร์ดโค้ด '2011' ดังนั้นสคริปต์ของคุณไม่จำเป็นต้องอัปเดตทุกปี

for ( $i = date('Y'); $i >= 1900; $i-- ) {
    echo "<option value=\"$i\"";
    echo $birthdayYear == $i ? 'selected="selected"' : '';
    echo ">$i</option>";
}

คำสั่ง echo ทั้งสามสามารถรวมเป็นหนึ่งเดียวได้ ฉันวางไว้บนบรรทัดแยกกันเพื่อความชัดเจน

person George Cummins    schedule 19.07.2011

1900 อย่างน้อยก็เป็นไปตามอำเภอใจเหมือนกับปี 2011 เราสามารถสร้างสิ่งที่มีระยะเวลาเพียง 100 ปีจากปีปัจจุบันได้

<?php $selectedYear = $_REQUEST['birthdayYear'] ?>
<select id="birthdayYear">
<option value="0">Year:</option>
<?php $currYear = date('Y') ?>
<?php for ($i=0; $i<100; ++$i) : ?>
<?php $displayYear = $currYear-$i ?>
<option value="<?= $displayYear ?>"<?= ($displayYear == $selectedYear ? 'selected="selected"' : '') ?>><?= $displayYear ?></option>
<?php endfor; ?>
</select>

หากต้องการกลับไปเป็น 1900 อย่างแน่นอน เพียงเปลี่ยนเงื่อนไขเป็น 112

person Mr Griever    schedule 19.07.2011

ขอวงหน่อย มันไม่ได้เป็นเรื่องของประสิทธิภาพของโค้ดมากนัก (ซึ่งในระดับนี้แทบจะไม่สำคัญเลย) แต่เป็นเรื่องของประสิทธิภาพของนักพัฒนาเป็นอย่างมาก: การวนซ้ำนั้นง่ายกว่ามากในสายตา มันไม่ได้บังคับให้ผู้อ่านเลื่อนหรือพับ และลดโอกาสที่การพิมพ์ผิดจะทำให้เกิดข้อบกพร่องเล็กๆ น้อยๆ (โดยวนซ้ำ ข้อผิดพลาดทั้งหมดหรือถูกต้องทั้งหมด)

จริงๆ แล้ว เมนูแบบเลื่อนลงใดๆ ที่มีมากกว่าสองรายการในรูปแบบปกติทำให้ฉันกระตุกและเข้าถึงคำหลัก for ร้อยคนกำลังเผชิญกับความลำบากใจ

person tdammers    schedule 19.07.2011