Intereting Posts

Случайный диапазон без дубликатов в PHP

У меня 60 изображений, но я хочу случайным образом показать 20 от 1 до 60.

Мой код примерно такой, он показывает 60

<?php for( $i = 1; $i < 61; $i++ ) { print '<a href="javascript:;"><img src="images/items/' . $i . '.png" class="allitems item' . $i . '" /></a>'; } ?> 

Я нашел функцию PHP RAND (), но не смог ее реализовать, любая помощь была бы оценена.

Попробуйте функции range() и array_rand() :

 <?php // range generates array with direct sequence from 1 to 60 (inclusive). // array_rand extracts 20 random keys from it. $range = array_rand(range(1, 60), 20); while(count($range)){ $i = array_shift($range) + 1; print '<a href="javascript:;"><img src="images/items/' . $i . '.png" class="allitems item' . $i . '" /></a>'; } ?> в <?php // range generates array with direct sequence from 1 to 60 (inclusive). // array_rand extracts 20 random keys from it. $range = array_rand(range(1, 60), 20); while(count($range)){ $i = array_shift($range) + 1; print '<a href="javascript:;"><img src="images/items/' . $i . '.png" class="allitems item' . $i . '" /></a>'; } ?> 

UPDv1: for -loop:

 <?php $range = array_rand(range(1, 60), 20); for($i = 0; $i < 20; $i++){ $image = $range[$i] + 1; print '<a href="javascript:;"><img src="images/items/' . $image . '.png" class="allitems item' . $image . '" /></a>'; } unset($range, $i, $image); ?> 

UPDv2:

Я неправильно прочитал array_rand() . Он возвращает ключи массива вместо элементов . Вот многоцелевая версия (исправить с помощью array_flip() ):

 <?php header('Content-Type: text/plain'); $buffer = range(1, 60); $buffer = array_flip($buffer); $buffer = array_rand($buffer, 20); foreach($buffer as $value){ echo $value, PHP_EOL; } ?> 

И функция быстрого доступа (безопасно для негативов и общий счетчик):

 <?php header('Content-Type: text/plain'); function random_range($min, $max, $count){ $count = abs((int)$count); if($min > $max){ list($min, $max) = array($max, $min); } $uniques = abs($max - $min); if($count > $uniques)$count = $uniques; return array_rand(array_flip(range($min, $max)), $count); } foreach(random_range(1, 60, 20) as $value){ echo $value, PHP_EOL; } ?> 

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

 <?php header('Content-Type: text/plain'); function random_range($min, $max, $count){ $count = abs((int)$count); if($min > $max){ list($min, $max) = array($max, $min); } $uniques = abs($max - $min); if($count > $uniques)$count = $uniques; $result = array(); $ready = 0; while($ready < $count){ $buffer = rand($min, $max); if(!in_array($buffer, $result)){ $result[] = $buffer; $ready++; } } return $result; } foreach(random_range(1, 60, 20) as $value){ echo $value, PHP_EOL; } ?> 

UPDv3:

Другой способ: array_slice() range() + shuffle() + array_slice() :

 <?php header('Content-Type: text/plain'); function random_range($min, $max, $count){ $count = abs((int)$count); if($min > $max){ list($min, $max) = array($max, $min); } $uniques = abs($max - $min); if($count > $uniques)$count = $uniques; $result = range($min, $max); shuffle($result); return array_slice($result, 0, $count); } foreach(random_range(5, 20, 5) as $random){ echo $random, ' '; } ?> 

Это будет работать

  <?php for( $i = 1; $i < 21; $i++ ) { $j = rand(1,60); print '<a href="javascript:;"><img src="images/items/' . $j . '.png" class="allitems item' . $i . '" /></a>'; } ?>