У меня 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>'; } ?>