• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

jak mozna w kodzie do losowania obrazków dodać wykluczenie wylosowanych

Object Storage Arubacloud
+2 głosów
530 wizyt
pytanie zadane 24 kwietnia 2022 w PHP przez gatka84 Bywalec (2,150 p.)

Hej witajcie posiadam kod do losowego generowania obrazu pobranych z folderu i działa ale często zdarza się że się powtarzają i chciałam zrobić tak żeby nie wyświetlał w tym samym czasie już wylosowanych

w folderze jest ok 30 zdjęć i przybywa.

$folder = opendir("uploads/gallery/");
$i = 0;
while(false !=($plik = readdir($folder))){
if($plik != "." && $plik != ".."){
	$obrazki[$i]= $plik;
	$i++;
	}
}
closedir($folder);
$losowy1=rand(0,count($obrazki)-1);
$losowy2=rand(0,count($obrazki)-1);
$losowy3=rand(0,count($obrazki)-1);
$losowy4=rand(0,count($obrazki)-1);
$losowy5=rand(0,count($obrazki)-1);
$losowy6=rand(0,count($obrazki)-1);
$losowy7=rand(0,count($obrazki)-1);
$losowy8=rand(0,count($obrazki)-1);

i kombinuje z unset ale nie potrafię wykombinować, że jak wylosuje już wybrany to losuje ponownie i wyświetli go

<?php echo 'uploads/gallery/'.$obrazki[$losowy1].''; ?>

no chyba, że idę w złą stronę to proszę o podpowiedz lub nakierowanie na przykłady

2 odpowiedzi

+2 głosów
odpowiedź 25 kwietnia 2022 przez VBService Ekspert (253,340 p.)
wybrane 6 maja 2022 przez gatka84
 
Najlepsza

Proponuję,

zamiast

<?php
   $folder = opendir("uploads/gallery/");
   $i = 0; 
   while(false !=($plik = readdir($folder))){
      if($plik != "." && $plik != ".."){
         $obrazki[$i]= $plik;
         $i++;
      }
   }
   closedir($folder);
?>

 

taki zapis ( glob()  array_filter()  is_file )

<?php
  $folder = 'uploads/gallery';
  $obrazki = array_filter(glob("$folder/*"), 'is_file');

  var_dump($obrazki); // Dla demonstracji

  // lub
  $obrazki = array_filter(glob("uploads/gallery/*"), 'is_file');

  var_dump($obrazki); // Dla demonstracji
?>

 

a do losowych obrazków bez powtórzeń użyć:  shuffle()array_slice()

<?php
  // Pobieramy wszystkie pliki np. *.jpg, *.png itp.
  // z folderu gallery i tworzymy tablicę 
  $obrazki = array_filter(glob("uploads/gallery/*"), 'is_file');

  var_dump($obrazki); // Dla demonstracji

  shuffle($obrazki); // "Mieszamy" elementy w tablicy
  // Pobieramy z tablicy pierwszych 8 elementów
  // jeżeli tablica "posiada" mniej elementów niż 8 
  // domyślnie ustawiana jest wtedy wielkość tablicy
  $obrazki = array_slice($obrazki, 0, 8 ?? count($obrazki));

  var_dump($obrazki); // Dla demonstracji
  echo "<img src='$obrazki[0]' title='".basename($obrazki[0])."' />
        <img src='$obrazki[1]' title='".basename($obrazki[1])."' /><br>
        <a href='.'>Ponów</a>"; 
?>

 

[ UPDATE ]

glob(pattern, flags)

<?php
  // Pobieramy wszystkie pliki tylko z rozszerzeniem: *.jpg, *.png.
  // z folderu gallery i tworzymy tablicę 
  $obrazki = array_filter(glob("{uploads/gallery/*.jpg,uploads/gallery/*.png}", GLOB_BRACE), 'is_file');
 
  var_dump($obrazki); // Dla demonstracji
 
  shuffle($obrazki); // "Mieszamy" elementy w tablicy
  // Pobieramy z tablicy pierwszych 8 elementów
  // jeżeli tablica "posiada" mniej elementów niż 8 
  // domyślnie ustawiana jest wtedy wielkość tablicy
  $obrazki = array_slice($obrazki, 0, 8 ?? count($obrazki));
 
  var_dump($obrazki); // Dla demonstracji
  echo "<img src='$obrazki[0]' title='".basename($obrazki[0])."' />
        <img src='$obrazki[1]' title='".basename($obrazki[1])."' /><br>
        <a href='.'>Ponów</a>"; 
?>

 

1
komentarz 25 kwietnia 2022 przez Wiciorny Ekspert (270,110 p.)
a nie warto, uwzględnić formatu pliku? Jeśli w danym źródle znajdować się bedą pliki w złym formacie, pojawią się błędy, nie wiem czy autor to chciał uwzględniać, ale taki CAE mi przyszedł na myśl.
komentarz 25 kwietnia 2022 przez VBService Ekspert (253,340 p.)

Założenie jest takie, że skoro folder ma nazwę gallery to raczej powinny się w nim znajdować pliki w "dobrym" formacie.  wink

Druga sprawa glob() domyślnie "uszkodzone" pliki pomija (w sensie nie ma możliwości ich prawidłowego odczytu).

komentarz 26 kwietnia 2022 przez gatka84 Bywalec (2,150 p.)

@VBService, 

dokładnie jak piszesz jest tylko jeden rodzaj plików w katalogu, dziękuje za podpowiedz i uwzględnienie title zdjęcia bo w sumie nie wiedziałam jak dołączyć do zdjęcia przy losowaniu :)

+2 głosów
odpowiedź 24 kwietnia 2022 przez SzkolnyAdmin Szeryf (86,360 p.)
Utwórz tablicę,  w której będziesz przechowywał dane wylosowanego obrazka (nazwę). W pętli losującej sprawdzaj, czy w tablicy nie ma już takiej nazwy. Jak nie ma - dodaj obrazek do tablicy, jak jest - kolejny obrót pętli.

Ogólnie poszukaj losowania bez powtórzeń.
komentarz 24 kwietnia 2022 przez gatka84 Bywalec (2,150 p.)

Ok czy tak jest poprawnie

$folder = opendir("uploads/gallery/");
$obrazki = array();
 
    while(false !=($plik = readdir($folder))){
      if($plik != "." && $plik != ".."){
	  $obrazki[] = $plik;
	}
}
closedir($folder);
    $losowe = array_rand($obrazki, 8);

 

komentarz 24 kwietnia 2022 przez SzkolnyAdmin Szeryf (86,360 p.)
A działa dobrze?
komentarz 26 kwietnia 2022 przez gatka84 Bywalec (2,150 p.)
działa

Podobne pytania

+1 głos
1 odpowiedź 279 wizyt
pytanie zadane 23 marca 2021 w C i C++ przez jan1 Nowicjusz (220 p.)
0 głosów
1 odpowiedź 290 wizyt
pytanie zadane 29 października 2018 w PHP przez avos24 Nowicjusz (120 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...