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