PHP – Výběr náhodných obrázků z adresáře na serveru
Náhodné soubory s požadovanými příponami, zadaný počet nebo všechny,
17. 6. 2013
PHP funkce pro náhodný výběr zadaného počtu souborů (nebo všech, pokud jich není dostatek; nebo všech, pokud je to zadáno)
s požadovanými příponami ze zadaného adresáře na serveru (hostingu).
Typicky pro výběr a vložení potřebného počtu náhodných obrázků, např. partnerů projektu, sponzorů, referencí, ukázek, nebo ilustrační a dekorativní grafiky.
//Martin Adámek, www.adamek.cz ///////////////////////////////////// //$pripony Seznam povolených přípon (á 3 nebo 4 znaky) //$cesta Cesta k prohledávanému adresáři na hostingu (bez koncového lomítka) //$kolik Názvy kolika souborů mají být vráceny (0 == všechny) ///////////////////////////////////// //Zjištění názvů náhodných souborů požadovaných přípon požadovaného počtu v požadovaném adresáři function vrat_nahodne_nazvy_souboru_z_adresare($pripony = array('jpg','jpeg','png'), $cesta = '', $kolik = 1) // V definici funkce uvedeny výchozí hodnoty vstupních proměnných, které se implicitně použijí, když dané proměnné nebudou při volání funkce explicitně zadány { //Inicializace $kolik = intval($kolik); //Ošetření textů, desetinných čísel a jiných nehezkých hodnot //Při chybě nebo poli na vstupu vrací 0 nebo 1 if ($kolik < 0) $kolik = 0; //Ošetření záporného vstupu $soubory = array(); //Pro nalezené vyhovující soubory $ktere = array(); //Pro klíče odkazující na vybrané názvy souborů $vysledek = array(); //Pro výběr k vrácení (vybrané názvy souborů) //Načtení názvů vyhovujících souborů $adresar = opendir($cesta); while ($soubor = readdir($adresar)) if ( in_array( substr($soubor, strlen($soubor)-3, 3), $pripony) or in_array( substr($soubor, strlen($soubor)-4, 4), $pripony) ) // Pozn.: pro výpis souborů všech přípon bez tohoto omezení nutno vyfiltrovat adresář a nadřazený adresář: $soubor!='.' and $soubor!='..' $soubory[] = $soubor; closedir($adresar); //Výběr hodnot k vrácení if (/*count($soubory) <= 1 or */ $kolik == 0 or count($soubory) <= $kolik) // Nutno vrátit vše nalezené // Platné podmínky: Chce všechny; nebo se jich našlo méně než je požadováno // Zakomentovaná podmínka: Našel se žádný nebo jeden (netřeba samostatně řešit, řeší to další dvě podmínky, když nahoře zajišťujeme, že $kolik>=0 a je celé číslo) $vysledek = $soubory; // Vracíme všechny else // Nutno vybrat jen požadovaný počet { $ktere = array_rand($soubory,$kolik); if ($kolik == 1) // array_rand vrací přímo klíč $vysledek[] = $soubory[$ktere]; // Ale tato funkce ho vrátí jako první prvek pole, aby šlo výsledky zpracovávat jednotným způsobem else // array_rand vrací pole klíčů foreach ($ktere as $ktery) $vysledek[] = $soubory[$ktery]; } return $vysledek; //Pole s názvy souborů s požadovanými příponami v požadovaném adresáři } //Vložení obrázků s logy partnerů projektu function vlozlogapartneru() { $soubory=vrat_nahodne_nazvy_souboru_z_adresare(array('jpg','jpeg','png','gif'), '/img/logotypes', 2); echo '<div id="partneri">'; foreach ($soubory as $soubor) echo '<img src="img/logotypes'.$soubor.'" alt="Partner projektu" title="Partner projektu" />'; // I když v tomto případě by se do altu správně měl psát přímo konkrétní název firmy (text viditelný na obrázku), což se tu neděje //V případě čistě dekorativního nebo jinak obsahově opravdu bezvýznamného obrázku nechte alt prázdný echo '</div>'; }
Funkce array_rand() sice vrací při různých volání různé výsledky (pokud má z čeho vybírat a není nucena vrátit všechno),
zato ale vždy ve stejném vzájemném pořadí vybraných prvků.
Pro zamíchání pořadí lze použít funkci shuffle().