Mostrare immagini da una cartella, ma solo un numero definito

  • Creatore Discussione Creatore Discussione Cosina
  • Data di inizio Data di inizio

Cosina

Utente Attivo
27 Dic 2016
101
0
16
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";

}

?>
 
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:
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)!
 
Grazie anche a te macus_adi. Ho provato la tua modifica, ma non funziona. Ciao
 
Ultima modifica:
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);
 
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++;

}
 
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:
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
 
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>');

}
 

Discussioni simili