php скрипт для показа 4 случайных фотографий из папки показывает одну и ту же фотографию 4 раза - PullRequest
0 голосов
/ 20 декабря 2011

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

вот файл random.php:

<?php
$folder = '.';

$extList = array();
$extList['jpg'] = 'image/jpeg';
$extList['jpeg'] = 'image/jpeg';

$img = null;

if (substr($folder,-1) != '/') {
$folder = $folder.'/';
}

if (isset($_GET['img'])) {
$imageInfo = pathinfo($_GET['img']);
if (
    isset( $extList[ strtolower( $imageInfo['extension'] ) ] ) &&
    file_exists( $folder.$imageInfo['basename'] )
) {
    $img = $folder.$imageInfo['basename'];
}
} else {
$fileList = array();
$handle = opendir($folder);
while ( false !== ( $file = readdir($handle) ) ) {
    $file_info = pathinfo($file);
    if (
        isset( $extList[ strtolower( $file_info['extension'] ) ] )
    ) {
        $fileList[] = $file;
    }
}
closedir($handle);

if (count($fileList) > 0) {
    $imageNumber = time() % count($fileList);
    $img = $folder.$fileList[$imageNumber];
}
}

if ($img!=null) {
$imageInfo = pathinfo($img);
$contentType = 'Content-type: '.$extList[ $imageInfo['extension'] ];
header ($contentType);
readfile($img);
} else {
if ( function_exists('imagecreate') ) {
    header ("Content-type: image/png");
    $im = @imagecreate (100, 100)
        or die ("Can't initialize image stream");
    $background_color = imagecolorallocate ($im, 255, 255, 255);
    $text_color = imagecolorallocate ($im, 0,0,0);
    imagestring ($im, 2, 5, 5,  "IMAGE ERROR", $text_color);
    imagepng ($im);
    imagedestroy($im);
}
} 

?>

вот как вызывается random.php:

<?php

/* DATA */
$data = array(
array('COUNT', '88', 'Here are a few of them', '1, 2, 3, 4'),
);
?>

<div>
<table class="reop"  border='0' width='100%'  cellpadding='0' cellspacing='10'>

<?php
$count = 0;
foreach($data as $row) {
    $class = ($count % 2 == 1 ? " class='alt'" : '');
    echo "<tr$class>";
    for($j = 0; $j < count($row); $j++) {
        if ($j!=3) {
            echo "<td class='cell_$j'>$row[$j]</td>";
        } else {


 //           $avatar = ''; 
            $array = preg_split('/,/', $row[$j], -1, PREG_SPLIT_NO_EMPTY);
            foreach ($array as $val) {
            $avatar .= '<img src="/staffpics/random.php"> ';
            }   
            echo "<td class='cell_$j'>$avatar</td>";

        }   

    }   
    echo '</tr>';
//    $count++;
}   

?>  

</table>

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

при отображении вашей страницы большинство браузеров немедленно запрашивают четыре изображения ... почти все одновременно.Ваш код "случайного" выбора изображения основан на time (), который возвращает количество секунд с начала unixtime.выполненный 4 раза в течение одной и той же секунды , он также даст тот же результат 4 раза.

Ваш код:

$imageNumber = time() % count($fileList);
$img = $folder.$fileList[$imageNumber];

должен быть переписан как:

// filelist starts with "0", count with "1" .. so we are off-by-one and first picture would never show without -1
$imageNumber = rand() % (count($fileList) - 1);
$img = $folder.$fileList[$imageNumber];

таким образом вы получите «случайные» картинки.

Кроме того, то, что прокомментировал Мистер Листер, является полностью действительным - ваш браузер может также кэшировать изображение и, таким образом, запрашивать Picutre только один раз и просто отображать его снова и снова, используя свой кэш.

, чтобы избежатьпри этом замените любой <img src="random.php"> на <img src="random.php?rand=<?= rand(); ?>">


Но обратите внимание:

ваш сервер может в конечном итоге возвращать одно и то же случайное число несколько раз, так что в конечном итоге (редко) вы будете в конечном итоге содно и то же изображение дважды на одной странице.

, чтобы исправить это, вы должны полностью переписать свой код.

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

гораздо проще, вы можете попробовать это:

// find all images - case SenSItivE
$all_images = glob("/path/to/images/*.{jpeg|jpg|png|gif}", GLOB_BRACE);
// bring array in random order
shuffle($all_images);
// pick four random images - you may also use a for or foreach loop to iterate the array
list ($img1, $img2, $img3, $img4) = $all_images; 
// write code to display four images here
1 голос
/ 21 декабря 2011

Вот еще один способ получения 4 случайных фотографий:

//randomize order
shuffle($fileList);
//get first 4 values of array
$randomPhotos = array_slice($fileList, 0, 4);

Обратите внимание, что случайное перемешивание может изменить порядок значений в исходном массиве.

0 голосов
/ 20 декабря 2011

Звоните srand, чтобы заполнить генератор случайных чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...