Изменить строку
$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);