代码之家  ›  专栏  ›  技术社区  ›  Stickers

从多个重复年份输出唯一年份

  •  1
  • Stickers  · 技术社区  · 7 年前

    在下面的循环中,它只输出来自repeater自定义字段中datepicker的年份数据。同一年内可以有多个对象。我想把任何一组重复的年份合并成一组,以便以后设置年份过滤器。

    <?php
        if (have_rows('list_link_items')) :
            echo '<select>';
            while (have_rows('list_link_items')) : the_row();
                $date = get_sub_field('date', false, false);
                if ($date) :
                    $date = new DateTime($date);
                    $date = $date->format('Y');
                endif;
                echo '<option>', $date, '</option>';
            endwhile;
            echo '</select>';
        endif;
    ?>
    

    <select>
        <option>2017</option>
        <option>2017</option>
        <option>2016</option>
        <option>2014</option>
        <option>2012</option>
        <option>2012</option>
        <option>2011</option>
        <option>2011</option>
        <option>2011</option>
        <option>2010</option>
        <option>2010</option>
        <option>2010</option>
        <option>2010</option>
        <option>2010</option>
        <option>2010</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
        <option>2009</option>
    </select>
    

    我想要的(没有重复的年份):

    <select>
        <option>2017</option>
        <option>2016</option>
        ...
        <option>2009</option>
    </select>
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Loek    7 年前

    这可能不是最有效的方法,但我会这样做。这也说明了日期不必按时间顺序输入。请注意,输出顺序仍然依赖于输入的顺序,但由于这不是问题所在,因此我没有将其考虑在内。

    <?php
        if (have_rows('list_link_items')) :
            echo '<select>';
            $dateList = []; // List to keep track of dates
            while (have_rows('list_link_items')) : the_row();
                $date = get_sub_field('date', false, false);
                if ($date) :
                    $date = new DateTime($date);
                    $date = $date->format('Y');
                    if (!in_array($date, $dateList)) :  // If date isn't in list
                        echo '<option>', $date, '</option>';  // echo it
                        $dateList[] = $date;  // and save the date to the list
                    endif;
                endif;
            endwhile;
            echo '</select>';
        endif;
    ?>
    

    如果您100%确定输入列表总是有序的,那么您甚至可以替换字符串的数组,只检查前一个日期。

        2
  •  1
  •   BizzyBob    7 年前

    这样的办法应该行得通。

    echo 惯性导航与制导。如果这个密钥存在,你知道你以前用过它,如果没有,那就继续回音。

    <?php
        if (have_rows('list_link_items')) :
            echo '<select>';
    
            // keep track of dates we've used
            $datesUsed = [];
    
            while (have_rows('list_link_items')) : the_row();
                $date = get_sub_field('date', false, false);
                if ($date) :
                    $date = new DateTime($date);
                    $date = $date->format('Y');
                endif;
    
                // only echo if the value hasn't been used yet
                if(is_null($dateUsed[$date])) echo '<option>', $date, '</option>';
    
                // add this date to the list so we don't use it next time
                $datesUsed[$date] = 1;
    
            endwhile;
            echo '</select>';
        endif;
    ?>