Imagens Aleatórias com PHP
Os iniciantes em Web Design vêem-se muitas vezes com esta dúvida: como mostrar imagens de forma aleatória.
Existem muitas formas para resolver este problema, mas todos eles andam à volta da função rand(). Vou em seguida mostrar uma forma para resolver este problema de forma estruturada.
É comum que todos os sites tenham uma ou mais páginas de só com funções, ou seja, o único código que estas contem-em são funções em PHP. É num destes ficheiros, que colocaremos a nossa função “displayRandomImage()“. Se não tem nenhum deste tipo de ficheiros, crie-o e coloque a função no fim do ficheiro (antes da tag “?>”).
/**
* Mostra uma imagem aleatória, em base num array passado por parâmetro.
* Se a imagem seleccionada não existir, é mostrada a imagem padrão.
*
* A imagem pode conter uma hiperligação http.
*
* @author Miguel Borges <miguelborges@miguelborges.com>
* @param array $images Array que contém as imagens.
* @param int $default Posição da imagem padrão.
* @param bool $display Opcional. O defeito é true. Se imprime (true) ou retorna (false).
* @return string Código (x)HTML de uma imagem ou void.
* @throws Exception
*/
function displayRandomImage(array $images, $default = 0, $display = true) {
$index = rand(0, count($images) - 1);
if(is_array($images[$index])) :
if(isset($images[$index][1]) and !empty($images[$index][1])) :
$image = array($images[$index][0], $images[$index][1]);
else :
$image = array($images[$index][0]);
endif;
else :
$image = array($images[$index]);
endif;
// testa se a imagem seleccionada existe/está disponível
if(!imageExist($image[0])) :
if(!is_numeric($default)) throw new Exception('Parameter $default must be a numeric type.');
// verifica se a imagem padrão é válida
if($default < 0 or $default > count($images)) throw new Exception('Invalid default image.');
$image = (array) $images[$default];
// testa se a imagem por defeito existe/está disponível
if(!imageExist($image[0])) throw new Exception('Default image don\'t exist.');
endif;
if(isset($image[1])) :
$htmlCode = '<a href="' . $image[1] .'"><img src="' . $image[0] . '" /></a>';
else :
$htmlCode = '<img src="' . $image[0] . '" />';
endif;
if(!$display)
return $htmlCode;
echo $htmlCode;
return;
}
/**
* Verifica se uma imagem está acessível.
*
* @author Miguel Borges <miguelborges@miguelborges.com>
* @param string $image Endereço da imagem.
* @return bool True em caso de estar acessível, ou false caso contrário.
*/
function imageExist($image) {
return @fopen($image,'r') === FALSE ? false : true;
}
A função recebe um array que deve conter os endereços http das imagens que queremos mostrar, a posição da imagem padrão (para o caso de uma das outras não estar disponível, começando em 0 [opcional]) e um booleano (opcional), onde se informa, se o resultado da função é para imprimir o resultada da função na página, ou se é para o retornar. A função também pode lançar excepções, caso seja encontrado algum erro.
Na linha 15 é gerado um número aleatório entre 0 ao tamanho do array “$images”, que será a posição do array a ser mostrada.
Nas linha 17 a 25 é testado se a posição gerada anteriormente, se existe um array (pois é possível ter numa posição do array passado por parâmetro, outro array, em que na posição “0″ se encontra o endereço da imagem, e na posição “1″ o endereço da hiperligação da imagem). Isto é útil para mostrar publicidade num site, em que cada imagem, redirecciona para uma página diferente.
Nas linha 27 a 38 é testado se a imagem seleccionada está disponível, e se não estiver, utiliza a imagem padrão, fazendo as respectivas validações.
Nas linhas seguintes é construído o código HTML da imagem/hiperligação, e em seguida mostrada ou retornada (conforme o valor de “$display”).
A função “imageExist()” é uma função auxiliar da anterior, que verifica se uma imagem está disponível ou não;
Agora que já temos a nossa função feita, é necessário criar um array, com os endereços das imagem a mostrar. Também é de boas práticas haver sempre um ficheiro de configuração em todos os sites. Este ficheiro geralmente contém as credenciais de acesso à base de dados entre outras configurações. É neste ficheiro que iremos criar o nosso array (se não tem nenhum deste tipo de ficheiros, crie-o).
$images = array(
'http://www.omeusite.com/images/image1.jpg',
'http://www.omeusite.com/images/image2.jpg',
'http://www.omeusite.com/images/image3.jpg',
array('http://www.omeusite.com/images/image4.jpg', 'http://www.omeusite.com/pagina1.html'),
array('http://www.omeusite.com/images/image5.jpg', 'http://www.omeusite.com/pagina2.html'),
array('http://www.omeusite.com/images/image6.jpg', 'http://www.omeusite.com/pagina3.html'),
array('http://www.omeusite.com/images/image7.jpg', ''),
array('http://www.omeusite.com/images/image8.jpg', ''),
array('http://www.omeusite.com/images/image9.jpg'),
array('http://www.omeusite.com/images/image10.jpg'),
array('http://www.omeusite.com/images/image11.jpg'),
);
As linhas 2, 3 e 4, conte-em os endereços das imagens as mostrar.
Da linha 8 a 12, também conte-em os endereços das imagens as mostrar, mas de uma maneira diferente.
As linhas 5, 6 e 7, para além dos endereços das imagens as mostrar, também defines os endereços para onde as imagem redireccionam.
Agora já temos o que é necessário, bastando fazer uma chamada à nossa função, na página onde for necessário, incluindo os ficheiros criados anteriormente.
<?php include "config.php"; ?> <?php include "includes/functions.php"; ?> <?php displayRandomImage($images); ?> <?php displayRandomImage($images, 0, true); ?> <?php echo displayRandomImage($images, 3, false); ?>
Espero que tenham entendido e gostado desse script!
Abraços








O seu script está muito bem pensado. No entanto penso que devia proteger o facto de não ser possivel aceder à imagem. Isso pode ser feito por exemplo com o fopen.
…
if(fopen($images[$index],”r”))
// apresenta imagem pretendida com ou sem link
else
//apresenta imagem por defeito
…
obrigado pelo seu comentário e pela sua dica.
actualizei o código acima, levando em consideração a verificação que sugeriu.