Вывести уникальные годы из нескольких повторяющихся лет

В приведенном ниже цикле он выводит только данные года из 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>

Я бы сохранял годы в массиве, затем удалял дубликаты и выводил список опций.

Alberto 03.09.2018 16:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
43
2
Перейти к ответу Данный вопрос помечен как решенный

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

Что-то вроде этого должно работать.

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

<?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;
?>

Другие вопросы по теме