Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用数组防止重复_Php - Fatal编程技术网

Php 使用数组防止重复

Php 使用数组防止重复,php,Php,我有一个图像列表和一个wordpress循环 我使用randompics()函数生成一个随机图像,用作prreview链接的背景。然而,我发现我在这里和那里生成重复的图像,它看起来不太好 我想找到一种方法,以确保我不会有相同的形象不止一次。在任何一个页面上,循环只有10次迭代 这是我的功能 function randompics() { $arrayName = array( get_template_directory_uri().'/images/jobs_large/1.jpg

我有一个图像列表和一个wordpress循环

我使用randompics()函数生成一个随机图像,用作prreview链接的背景。然而,我发现我在这里和那里生成重复的图像,它看起来不太好

我想找到一种方法,以确保我不会有相同的形象不止一次。在任何一个页面上,循环只有10次迭代

这是我的功能

function randompics() {
  $arrayName = array(
    get_template_directory_uri().'/images/jobs_large/1.jpg',
    get_template_directory_uri().'/images/jobs_large/2.jpg',
    get_template_directory_uri().'/images/jobs_large/3.jpg',
    get_template_directory_uri().'/images/jobs_large/4.jpg',
    get_template_directory_uri().'/images/jobs_large/5.jpg',
    get_template_directory_uri().'/images/jobs_large/6.jpg',
    get_template_directory_uri().'/images/jobs_large/7.jpg',
    get_template_directory_uri().'/images/jobs_large/8.jpg',
    get_template_directory_uri().'/images/jobs_large/9.jpg',
    get_template_directory_uri().'/images/jobs_large/11.jpg',
    get_template_directory_uri().'/images/jobs_large/12.jpg',    
    //list goes up to 25 images
  );
 echo $arrayName[array_rand($arrayName)];
}
这是我的循环

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

  <div class="item-container">
    <?php randompics(); ?>
  </div>

<?php endwhile; else : endif;?>


提前感谢。

我想最简单的方法是使用静态变量:

function randompics() {
  static $arrayName = null;
  if (is_null($arrayNme)) {
    $arrayName = array(
      get_template_directory_uri().'/images/jobs_large/1.jpg',
      get_template_directory_uri().'/images/jobs_large/2.jpg',   
      //list goes up to 25 images
    );
    shuffle($arrayName);
  }
  static $index = 0;
  echo $arrayName[$index++];
}
但是,这确实会在函数调用之间共享数据,这通常是不鼓励的。更好的解决方案(至少IMHO)是使用ImageRandomiser类,并让该类的对象跟踪重复项

使用,例如:

class ImageRandomiser
{
  private $images;
  private $index;

  public function __construct(string ...$imageUris)
  {
    $this->index = 0;
    $this->images = $imageUris;
    shuffle($this->images);
  }

  public static function fromDefaults() : self
  {
    return new static(
      get_template_directory_uri().'/images/jobs_large/1.jpg',
      get_template_directory_uri().'/images/jobs_large/2.jpg',
      // ...
    );
  }

  public function imageUri() : string
  {
    $this->index++;
    if ($this->index >= count($this->images)) {
      $this->index = 0;
    }
    return $this->images[$this->index];
  }
}
循环:

<?php 
$random = ImageRandomiser::fromDefaults();
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

  <div class="item-container">
    <?php $random->imageUri(); ?>
  </div>

<?php endwhile; else : endif; ?>

为什么不使用另一个变量作为在每次迭代中递增的索引,然后使用一个
randompics($index)不使用
array\u rand()
我的意思是?你可以使用“临时内存”。如果此生成是基于用户的,则可以使用$\u SESSION变量存储已显示的图像,否则可以选择基于文件的临时内存进行存储。创建一个图像数组,将其洗牌,然后按顺序从数组中拾取…