2015-10-21 3 views
1

Я хочу отобразить случайное число n изображений из папки. В настоящее время я использую этот сценарий для отображения изображенийPHP отображает случайные n изображений из каталога

<?php 
$dir = './images/gallery/'; 
foreach(glob($dir.'*.jpg') as $file) { ?> 
<div class="item"><img src="<?php=$file;?>"></div> 
<?php } ?> 

Я хочу только 10 (или n номеров) изображений, что слишком случайно. Как это сделать?

ответ

1

Метод shuffle() поставит элементы заданного массива в случайном порядке:

<?php 
$dir = './images/gallery/'; 

function displayImgs($dir, $n=10){ 
$files = glob($dir.'*.jpg'); 
shuffle($files); 
$files = array_slice($files, 0, $n); 
foreach($files as $file) { ?> 
<div class="item"><img src="<?php=$file;?>"></div> 
<?php } 
} ?> 

Использование: displayImgs ("/ реж/температуры/путь", 20);

+0

Я не уверен, что это будет отображать случайные изображения. – Manikiran

+0

'n-1' - это что? Можете ли вы уточнить .. – Darren

+0

n по умолчанию равно 10 в этой функции. Если у вас есть 10 изображений в массиве, вы будете обращаться к ним как от 0 до 9 или (10-1) здесь – PC3TJ

0

Использование Builtin Случайная функция называется rand():

<?php 
$dir = './images/gallery/'; 
for($i=0;$i<=10;$i++) { 
    echo '<div class="item"><img src="'.$dir.rand(1,10).'.jpg"></div>'; 
} 
?> 
+0

Насколько я знаю, rand() не существует в строковом типе данных. –

+0

@ JitendraKumar.Balla Вам нужно проверить документацию http://php.net/manual/en/function.rand.php – Manikiran

+0

Я знаю использование rand(), но он будет генерировать случайное число от 1, n я не буду перемещать позиции массива. –

0

Давайте сначала создадим массив и нажать несколько случайных чисел в него. И по вашему желанию $n будет 10.

$n = 10; 
$arr = array(); 
for($i = 1; $i <= $n; $i++){ 
    /* Where $n is the limit */ 
    $rand = rand($n); 
    array_push($arr, $rand); 
} 

Так что теперь у нас есть массив, содержащий случайные цифры, и теперь мы должны повторить из изображений перебора массива:

foreach($arr as $image){ 
    $intToStr = (string) $image; 
    foreach(glob($dir. $intToStr . '.jpg') as $file){ 
     echo "<div class='item'>$file</div>"; 
    } 
} 

Это эхо ваших изображений.

+0

Просто вы можете использовать shuffle() –

1

Ну, это может быть излишним, но вы также можете использовать итератор каталогов и некоторую случайность для достижения этого. Я использовал модифицированную версию функции генерации случайных чисел из ответа this.

убедитесь, что путь, который вы передаете функции, относится к каталогу, в котором находится скрипт, с слэш в начале. Константы __DIR__ не изменятся, если бы вы случайно вызвали этот сценарий из разных мест в вашей иерархии файлов.

<?php 

function randomImages($path,$n) { 

    $dir = new DirectoryIterator(__DIR__. $path); 

    // we need to know how many images we can range on 
    // but we do not want the two special files . and .. 
    $count = iterator_count($dir) - 2; 

    // slightly modified function to create an array containing n random position 
    // within our range 
    $positionsArray = UniqueRandomNumbersWithinRange(0,$count-1,$n); 

    $i = 0; 
    foreach ($dir as $file) { 

     // those super files seldom make good images 
     if ($file->getFilename() === '.' || $file->getFilename() === '..') continue; 

     if (isset($positionsArray[$i])) echo '<div class="item"><img src="'.$file->getPathname().'"></div>'; 

     $i++; 
     // change the count after the check of the filename, 
     // because otherwise you might overflow 
    } 
} 

function UniqueRandomNumbersWithinRange($min, $max, $quantity) { 
    $numbers = range($min, $max); 
    shuffle($numbers); 
    return array_flip(array_slice($numbers, 0, $quantity)); 
} 
+0

Super. Работает отлично. Но мой контрольный элемент показывает ''.Почему он показывает \ вместо /? – user3045457

+0

hmmm ... не уверен. вы на окне окна? правильно ли он отображается? –

+0

Да., Изображения отображаются правильно. – user3045457

Смежные вопросы