PHP Scandir для JPG фото предел 1 - PullRequest
0 голосов
/ 15 марта 2012

Я ломал голову, пытаясь понять это.

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

Мне нужен очень простой способ отсканировать директрой, проверить ее jpg, а затем показать только одну фотографию.

Пожалуйста, скажите мне, как я могу изменить следующий код или мне нужно написать что-то другое для моих нужд.

<?php // no access
.............

// globals 

.............

// make article title lower case

$str = strtolower($articleTitle); 

$files= scandir("images/gallery/".$str."/");
$photos = array();
        for ($x=0; $x<count($files); $x++){
        $files[$x]="images/gallery/".$str."/".$files[$x];
                if (is_dir($files[$x])){
                $thisfolder=scandir($files[$x]);
                for ($f=0; $f<count($thisfolder); $f++)
                if (strpos(strtolower($thisfolder[$f]), ".jpg"))
                $photos[]=$files[$x]."/".$thisfolder[$f];
                }
        }
$rand=rand(0, count($photos)); ?>
<img src="includes/crop.php?src=<?php echo $photos[$rand];?>&h=115&w=650&q=90" title="<?php echo $photos[$rand];?>" />

Еще раз спасибо заранее :) джон

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Изменить строку

$rand=rand(0, count($photos))

до

$rand=rand(0, count($photos)-1)

Используете ли вы rand для выбора случайного изображения, но вы должны ограничить значения в интервале [0, count ($ photos) -1] в противном случае может произойти переполнение индекса. Ошибка поражает ваш код, но в случае каталога, содержащего только изображение, проблема очевидна.

count($photo) равно 1, а массив содержит только элемент с индексом 0.

$ rand = rand (0, count ($ photos)) => $ rand = rand (0,1) => $ rand может принимать два разных значения: 0 или 1. В первом случае все работают как задумано. В последнем случае ошибка возникнет.

Ссылка: http://www.php.net/rand

Добавление

В ответ на комментарий: код достаточно эффективен в случае пустой директории, так как при выполнении будет пропущен внешний оператор for. Вы можете использовать if, чтобы пропустить весь код, но прирост эффективности будет незначительным.

.............

$str = strtolower($articleTitle); 

$files= scandir("images/gallery/".$str."/");
if (count($files)) {
    $photos = array();
        for ($x=0; $x<count($files); $x++){
        $files[$x]="images/gallery/".$str."/".$files[$x];
            if (is_dir($files[$x])){
                $thisfolder=scandir($files[$x]);
                for ($f=0; $f<count($thisfolder); $f++)
                if (strpos(strtolower($thisfolder[$f]), ".jpg"))
                    $photos[]=$files[$x]."/".$thisfolder[$f];
            }
        }
    $rand=rand(0, count($photos)-1);
    echo '<img src="includes/crop.php?src=' . $photos[$rand] 
       . '&h=115&w=650&q=90" title="'$photos[$rand]" />';
}

Я бы использовал другой подход, примерно такой:

$dirName = strtolower($articleTitle);
$oldDir = cwd();
chdir('images/gallery/'.$dirName);
$photos = glob('*.jpg');
$foreach(glob('*',GLOB_ONLYDIR) as $subdir) {
    $photos = array_merge($photos, glob($subdir.'/*.jpg'));
}
if (count($photos)) {
    $rand=rand(0, count($photos)-1);
    echo '<img src="includes/crop.php?src=' . $photos[$rand] 
         . '&h=115&w=650&q=90" title="'$photos[$rand]" />';
}
chdir($oldDir);
0 голосов
/ 15 марта 2012

Вы можете попробовать с простым кодом

<code>$files= scandir("images/"); $photos = ""; for ($x=0; $x < count($files); $x++){< if (strpos(strtolower($files[$x]), ".jpg")){ $photos = "images/".$files[$x]; break; } } ?> <img src="<?php echo $photos;?>" title="<?php echo $photos;?>" />

...