PHP цикл через массив после shuffle() вызывает ошибку

Я получаю следующую ошибку после перетасовки массива, а затем пытаюсь перебрать его. Я пытаюсь рандомизировать порядок размещения терминов из переменной $tags.

Предупреждение: неверный аргумент предоставлен для foreach()

Здесь происходит ошибка

$tags = wp_get_post_terms( $post->ID , $taxonomy, $tax_args);
$tags = shuffle($tags);
if ($tags) {
  foreach ($tags as $tag) { 
       // so on ...

и полная функция

$backup = $post; // backup the current object
$taxonomy = 'character' ;//  e.g. post_tag, category, custom taxonomy
$param_type = 'character'; //  e.g. tag__in, category__in, but genre__in will NOT work
$post_types = get_post_types( array('public' => true), 'names' );
$tax_args=array('orderby' => 'none');
$tags = wp_get_post_terms( $post->ID , $taxonomy, $tax_args);
$tags = shuffle($tags);
if ($tags) {
  foreach ($tags as $tag) {
    $args=array(
      "$param_type" => $tag->slug,
      'post__not_in' => array($post->ID),
      'post_type' => $post_types,
      'orderby' => 'rand',
      'caller_get_posts' => 1
    );
    $my_query = null;
    $my_query = new WP_Query($args);
    if( $my_query->have_posts() ) {
      while ($my_query->have_posts()) : $my_query->the_post(); ?>
        <h3><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h3>
        <?php
      endwhile;
    }
  }
}
$post = $backup;  // copy it back
wp_reset_query(); // to use the original query again

Кто-нибудь видит что-то не так с этим кодом? Любое объяснение высоко ценится. Спасибо!!!

3 ответа

Решение

shuffle($array) возвращает логическое значение: TRUE of FALSE. foreach ожидает массив, а не логическое значение, которое объясняет вашу ошибку.

Просто пиши shuffle($array)не $array = shuffle($array)

http://php.net/manual/en/function.shuffle.php

bool shuffle ( array &$array )

Это правильно:

shuffle($tags);

shuffle не возвращает перетасованный массив, он переставляет массив на месте. Очевидно, он возвращает логическое значение true или false при сбое, но как это могло произойти, остается загадкой.

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