Удалить дубликаты wp_user foreach с помощью array_unique – ошибка рендеринга?

StackOverflow https://stackoverflow.com//questions/20032596

Вопрос

Объединив таксономии и роли пользователей, я перечисляю все термины налога «собака», а для каждого термина «собака» — список всех «цветов», связанных с профилем пользователя.ПРИМЕР:

  • У пользователя 1 есть мета «Собака:Золотистый ретривер» и «Окрас:Желтый», сохраненный в профиле.
  • У пользователя 2 есть мета «Собака:Золотистый ретривер» и «Окрас:Черный», сохраненный в профиле.
  • У пользователя 3 есть мета «Собака:Золотистый ретривер» и «Окрас:Черный», сохраненный в профиле.

В теге заголовка 3 ниже указано «имя термина» =, которое в данном случае будет «собака».Под собакой, должен быть список «цветов», связанных с этой собакой через мета-данные пользователя — IE, Желтый, Черный. Важно то, что «Черный» появляется ТОЛЬКО ОДИН, а не два раза.Я пытаюсь удалить дубликаты, но получаю сообщение об ошибке.

Отредактировано:Ошибка больше не сохраняется.Однако теперь массив echo $array отображает только «Черный», а не «Желтый» или любой другой цвет.

Есть предположения?

<?php $terms = get_terms('dogs');
$count = count($terms);
if ( $count > 0 ){ foreach ( $terms as $term ) { ?>

<h3><?php echo $term->name; ?></h3> // Show different "dog" type names 

<div class="listed_dogs_color_names"> 

    // Now search all editor and contributor user profiles for "dog" and "color" user_meta. Color and dog are both taxonomies that are used both with posts and users (user meta)
    // If matches with the "dog" above, list "color" underneath "dog name" in <h3></h3> above.

<?php
$term_parent = $term->parent;
$term_slug = $term->slug;
$editor_query = new WP_User_Query(
    array(
    'role'         => 'editor',
    'meta_key'     => $term_parent, 
    'meta_compare' => '=', 
    'meta_value'   => $term_slug,       
)
);
$editors = $editor_query->get_results();
$contributor_query = new WP_User_Query(
    array(
    'role'         => 'contributor',
    'meta_key'     => $term_parent, 
    'meta_compare' => '=', 
    'meta_value'   => $term_slug,       
)
);
$contribs = $contributor_query->get_results();
$users = array_merge( $contribs, $editors ); 
?>

<?php 
                    $array = array(); // initialize as empty array ?>
                        <?php if (!empty($users)) {?>
                                <?php foreach ($users as $user) : 
                                        $b = $user->color;
                                        $color = explode("\n", $b);
                                        $array[] = $color[0];
                                        ?>
                            <?php endforeach; ?>

                            <?php $array = array_unique($array); ?>
                            <?php 
                            echo "<li>";
                            echo $array[0]; 
                            echo "</li>";
                            ?>
                        <?php } ?>

</div><!--close-->
<?php }?>
<?php }?>
Это было полезно?

Решение 2

Решение проблемы, большое спасибо @amal за прогулку по нему со мной

<?php if (!empty($users)) {?>
  <ul>
    <?php 
   $array = array();
   foreach ($users as $user) :  
       $b = $user->color;
       $color = explode("\n", $b);
       $array[] = $color[0];
    ?>

<?php endforeach; ?> // close the foreach, looped through all users already and stored meta into array

<?php $array = array_unique($array, SORT_REGULAR); ?> // take array and remove dupes                        

     <?php foreach ($array as $item) { ?> // foreach and style. can also implode and separate with commas via <?php $spitarray = implode ( ", ", $spitarray); ?>
          <li><?php echo $item; ?></li>
     <?php } ?>
  </ul>
<?php } ?>
.

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

По умолчанию PHP попытается преобразовать объекты в строки для сравнения.Это вызывает ошибку.Вы можете указать второй параметр array_unique() чтобы переопределить это:

foreach(array_unique($users, SORT_REGULAR) as $user)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top