Необходимо объединить / устранить дубликаты во вложенном массиве - PullRequest
1 голос
/ 06 апреля 2020

Мне нужно создать аккордеонный список заголовков новостных статей, сгруппированных по годам. Пока что содержание аккордеонных панелей корректно, каждая панель показывает все новостные посты за этот год.

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

Что мне нужно сделать, чтобы получить только одну панель с правильным количеством названий внутри?

Вот мой SQL:

   $newsposts = $wpdb->get_results("
SELECT YEAR(wp_posts.post_date) AS post_year, wp_posts.post_title, wp_posts.ID AS post_id 
FROM wp_posts LEFT JOIN wp_term_relationships ON 
(wp_posts.ID = wp_term_relationships.object_id) 
WHERE wp_term_relationships.term_taxonomy_id = 3 
AND wp_posts.post_status = 'publish' 
ORDER BY post_date
              ", OBJECT );

Вот моя разметка:

                  <?php foreach($newsposts as $year) : ?> <?php //print_r($year); ?>
                  <li class="accordion-item" data-accordion-item>
                    <a href="#" class="accordion-title"><?php echo $year->post_year; ?></a>

                     <div class="accordion-content" data-tab-content>
                       <?php foreach($newsposts as $post) : ?> <?php //print_r($post); ?>
                       <?php // Continue unless years match
                         if ( $post->post_year != $year->post_year ) continue; ?>
                           <a href="<?php the_permalink($post->post_id); ?>"><?php echo $post->post_title; ?></a><br/>
                       <?php endforeach; //$posts ?>
                     </div>

                   </li>
                 <?php endforeach; //$year ?>
                 </ul>

Почему-то мне нужно ограничить первый foreach только одним для каждого представленного года. Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 07 апреля 2020

Я работал над этим и нашел ответ благодаря этому сообщению: удалить дубликаты в foreach

В моем случае вот моя исправленная разметка:

            <?php $yearposts = array(); ?>
            <?php foreach($newsposts as $year) : ?> <?php $postyear = $year->post_year; ?>
            <?php if(!in_array($postyear, $yearposts))  { ?>
               <li class="accordion-item" data-accordion-item>
                <a href="#" class="accordion-title"><?php echo $postyear; array_push($yearposts,$postyear); ?></a>
                   <div class="accordion-content" data-tab-content>
                     <ul class="accordlist">
                       <?php foreach($newsposts as $post) : ?> 
                       <?php // Continue unless years match
                         if ( $post->post_year != $year->post_year ) continue; ?>
                       <li><a class="newstitle" href="<?php the_permalink($post->post_id); ?>"><?php echo $post->post_title; ?></a></li>
                       <?php endforeach; //$posts ?>
                     </ul>
                   </div>
                 </li> 
              <?php } // end in_array conditional ?>
            <?php endforeach; //$year ?>
           </ul>

Как указано в сообщении,

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

Моя версия разбита на части, чтобы окружить элементы, необходимые для форматирования аккордеона.

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

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...