Вывод уникальных лет из нескольких повторяющихся лет - PullRequest
0 голосов
/ 03 сентября 2018

В приведенном ниже цикле выводятся только данные года из указателя даты в настраиваемом поле повторителя. В течение одного года может быть несколько объектов. Я хотел бы объединить любую группу повторяющихся лет в один, чтобы позже я мог настроить фильтр лет.

<?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 голосов
/ 03 сентября 2018

Нечто подобное должно работать.

По сути, просто используйте массив для отслеживания уже использованных дат, добавив ключ со значением даты. Затем проверьте, существует ли этот ключ перед echo ing. Если ключ существует, вы знаете, что использовали его раньше, а если нет, то продолжайте эхо.

<?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;
?>
0 голосов
/ 03 сентября 2018

Вероятно, это не самый эффективный способ, но я бы сделал это так. Также учитывается тот факт, что даты не должны быть в хронологическом порядке на входе. Обратите внимание, что порядок вывода по-прежнему зависит от порядка ввода, но, поскольку это не вопрос, я не учел его.

<?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% уверены, что список ввода всегда упорядочен, вы можете даже заменить массив на строку и проверить только на предыдущую дату.

...