Mostrare immagini da una cartella, ma solo un numero definito

Cosina

Utente Attivo
27 Dic 2016
68
0
6
Buongiorno a tutti. Ho trovato un codice che mi permette di visualizzare le immagini contenute in una cartella. Vorrei aggiungere la regola per stabilire il numero di immagini da visualizzare, per esempio 4 (più recenti). Come posso fare? Il codice è quello che segue. Grazie mille per l'aiuto.

PHP:
<?php

header('Content-Type: text/javascript; charset=UTF-8');

$imageFolder = 'folder/';

$imageTypes = '{*.jpg,*.JPG,*.jpeg,*.JPEG,*.png,*.PNG,*.gif,*.GIF}';

$sortByImageName = false;

$newestImagesFirst = true;

$images = glob($imageFolder . $imageTypes, GLOB_BRACE);

if ($sortByImageName) {

    $sortedImages = $images;

    natsort($sortedImages);

} else {

    $sortedImages = array();

    $count = count($images);

    for ($i = 0; $i < $count; $i++) {

        $sortedImages[date('YmdHis', filemtime($images[$i])) . $i] = $images[$i];

    }

    if ($newestImagesFirst) {

        krsort($sortedImages);

    } else {

        ksort($sortedImages);

    }

}

foreach ($sortedImages as $image) {

    $name = 'Image name: ' . substr($image, strlen($imageFolder), strpos($image, '.') - strlen($imageFolder));

    $lastModified = '(last modified: ' . date('F d Y H:i:s', filemtime($image)) . ')';

    writeHtml('<div class="ins-imgs-li">');

    writeHtml('<img src="' . $image . '" alt="' . $name . '" title="' . $name . '">');

    writeHtml('<p class="ins-imgs-label">' . $name . ' ' . $lastModified . '</p>');

    writeHtml('</div>');

}

function writeHtml($html) {

    echo "document.write('" . $html . "');\n";

}

?>
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
krsort inverte la chiave associativa spostando la sequenza dell'ultima alla prima.
se non vuoi iterare tutti gli array ti devi fermare a minore di 4 o 4.
prima del foreach.
PHP:
$y=0;
foreach ($sortedImages as $image) {
$name = 'Image name: ' . substr($image, strlen($imageFolder), strpos($image, '.') - strlen($imageFolder));

$lastModified = '(last modified: ' . date('F d Y H:i:s', filemtime($image)) . ')';

writeHtml('<div class="ins-imgs-li">');

writeHtml('<img src="' . $image . '" alt="' . $name . '" title="' . $name . '">');

writeHtml('<p class="ins-imgs-label">' . $name . ' ' . $lastModified . '</p>');

writeHtml('</div>');
if($y == 3) {
break;
}
$y++;

}
In questo esempio con al massimo 4 iterazioni è sia per le più recenti o l'atro tipo.
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
Per ottimizzare ancora di più sarebbe più consono ciclare solo gli N elementi necessari in quanto "IF" viene valutato ad ogni iterazione aumentando la complessità....
PHP:
foreach(array_slice($sortedImages,0,4) as $el){}

Ciao prima il codice era lento adesso piu veloce.
In questo modo sarà ancora più veloce (livello macchina)!
 

Cosina

Utente Attivo
27 Dic 2016
68
0
6
Grazie anche a te macus_adi. Ho provato la tua modifica, ma non funziona. Ciao
 
Ultima modifica:

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Ciao Macus_adi grazie per il tuo contributo.
Cosina prova prima del foreach a limitare un array a massimo di 4 elementi.
$sortedImages = array_slice($sortedImages, 0, 4);
 

Cosina

Utente Attivo
27 Dic 2016
68
0
6
Ciao Macus_adi grazie per il tuo contributo.
Cosina prova prima del foreach a limitare un array a massimo di 4 elementi.
$sortedImages = array_slice($sortedImages, 0, 4);
L'ho fatto e funziona (nel senso che vedo le 4 immagini), però dimmi se ho interpretato bene le istruzioni e se il codice così è corretto:
PHP:
$y=0;

$sortedImages = array_slice($sortedImages, 0, 4);

foreach ($sortedImages as $image) {
    
$name = 'Image name: ' . substr($image, strlen($imageFolder), strpos($image, '.') - strlen($imageFolder));

$lastModified = '(last modified: ' . date('F d Y H:i:s', filemtime($image)) . ')';

writeHtml('<div class="ins-imgs-li">');

writeHtml('<img src="' . $image . '" alt="' . $name . '" title="' . $name . '">');

writeHtml('<p class="ins-imgs-label">' . $name . ' ' . $lastModified . '</p>');

writeHtml('</div>');
if($y == 4) {
break;
}
$y++;

}
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Si sei sulla giusta strada.
Comunque dovresti usare semplicemente $sortedImages = array_slice($sortedImages, 0, 4, true);
Questo aggiorna la variabile $sortedImages nel contenere massimo 4 elementi preservando la chiave originale.
 
Ultima modifica:

Cosina

Utente Attivo
27 Dic 2016
68
0
6
Si sei sulla giusta strada.
Comunque dovresti usare semplicemente array_splice($sortedImages, 4);
Questo aggiorna la variabile $sotedImages nel contenere massimo 4 elementi con la loro chiave originale.
Abbi pazienza....non ho capito cosa devo togliere, me lo specifichi meglio. Grazie
 

Cosina

Utente Attivo
27 Dic 2016
68
0
6
Abbi pazienza....non ho capito cosa devo togliere, me lo specifichi meglio. Grazie
Ora credo di aver capito. Giusto così:

PHP:
$sortedImages = array_slice($sortedImages, 0, 4);

foreach ($sortedImages as $image) {
    
$name = 'Image name: ' . substr($image, strlen($imageFolder), strpos($image, '.') - strlen($imageFolder));

$lastModified = '(last modified: ' . date('F d Y H:i:s', filemtime($image)) . ')';

writeHtml('<div class="ins-imgs-li">');

writeHtml('<img src="' . $image . '" alt="' . $name . '" title="' . $name . '">');

writeHtml('<p class="ins-imgs-label">' . $name . ' ' . $lastModified . '</p>');

writeHtml('</div>');

}