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

时间:2018-09-03 14:24:20

标签: php wordpress advanced-custom-fields

在下面的循环中,它仅在重复器自定义字段中输出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 个答案:

答案 0 :(得分:2)

这可能不是最有效的方法,但我会这样做。还考虑了以下事实:输入时日期不必按时间顺序排列。请注意,输出顺序仍然取决于输入的顺序,但是由于这不是问题,因此我没有考虑到它。

<?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%确定输入列表始终是有序的,则甚至可以将数组替换为字符串,并只检查前一个日期。

答案 1 :(得分:1)

类似的事情应该起作用。

基本上,只需添加一个带有日期值的键,就可以使用数组来跟踪已经使用的日期。然后在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;
?>