2009-07-27 9 views
0

J'ai un script PHP qui crée une vignette et liste une galerie d'images. Le problème que j'ai est qu'il le liste par horodatage sur le serveur mais je veux qu'il liste 'naturellement'.PHP: Tri du tableau avec natsort

<?php 
# SETTINGS 
$max_width = 100; 
$max_height = 100; 
$per_page = 24; 

$page = $_GET['page']; 

$has_previous = false; 
$has_next = false; 

function getPictures() { 
    global $page, $per_page, $has_previous, $has_next; 
    if ($handle = opendir(".")) { 
     $lightbox = rand(); 
     echo '<ul id="pictures">'; 

     $count = 0; 
     $skip = $page * $per_page; 

     if ($skip != 0) 
      $has_previous = true; 

     while ($count < $skip && ($file = readdir($handle)) !== false) { 
      if (!is_dir($file) && ($type = getPictureType($file)) != '') 
       $count++; 
     } 
     $count = 0; 
     while ($count < $per_page && ($file = readdir($handle)) !== false) { 
      if (!is_dir($file) && ($type = getPictureType($file)) != '') { 
       if (! is_dir('thumbs')) { 
        mkdir('thumbs'); 
       } 
       if (! file_exists('thumbs/'.$file)) { 
        makeThumb($file, $type); 
       } 
       echo '<li><a href="'.$file.'" class="zoom" rel="group">'; 
       echo '<img src="thumbs/'.$file.'" alt="" />'; 
       echo '</a></li>'; 
       $count++; 
      } 
     } 
     echo '</ul>'; 

     while (($file = readdir($handle)) !== false) { 
      if (!is_dir($file) && ($type = getPictureType($file)) != '') { 
       $has_next = true; 
       break; 
      } 
     } 
    } 
} 

function getPictureType($file) { 
    $split = explode('.', $file); 
    $ext = $split[count($split) - 1]; 
    if (preg_match('/jpg|jpeg/i', $ext)) { 
     return 'jpg'; 
    } else if (preg_match('/png/i', $ext)) { 
     return 'png'; 
    } else if (preg_match('/gif/i', $ext)) { 
     return 'gif'; 
    } else { 
     return ''; 
    } 
} 

function makeThumb($file, $type) { 
    global $max_width, $max_height; 
    if ($type == 'jpg') { 
     $src = imagecreatefromjpeg($file); 
    } else if ($type == 'png') { 
     $src = imagecreatefrompng($file); 
    } else if ($type == 'gif') { 
     $src = imagecreatefromgif($file); 
    } 
    if (($oldW = imagesx($src)) < ($oldH = imagesy($src))) { 
     $newW = $oldW * ($max_width/$oldH); 
     $newH = $max_height; 
    } else { 
     $newW = $max_width; 
     $newH = $oldH * ($max_height/$oldW); 
    } 
    $new = imagecreatetruecolor($newW, $newH); 
    imagecopyresampled($new, $src, 0, 0, 0, 0, $newW, $newH, $oldW, $oldH); 
    if ($type == 'jpg') { 
     imagejpeg($new, 'thumbs/'.$file); 
    } else if ($type == 'png') { 
     imagepng($new, 'thumbs/'.$file); 
    } else if ($type == 'gif') { 
     imagegif($new, 'thumbs/'.$file); 
    } 
    imagedestroy($new); 
    imagedestroy($src); 
} 
?> 
+0

Que dans le monde ce que cela signifie pour trier quelque chose « naturellement »? – thedz

+1

@thedz: Comme un humain le ferait. http://php.net/natsort – hobodave

+0

@hobodave: ah, intéressant. Je ne le savais pas. Merci! – thedz

Répondre

0

L'astuce était de mettre tout à l'intérieur d'un tableau. .. J'ai pris la liberté de réécrire votre fonction getPictures() ... Celui-ci implémente le tri.

function getPictures() { 
    global $page, $per_page, $has_previous, $has_next; 

    if (!is_dir('thumbs')) { 
     mkdir('thumbs'); 
    } 

    if ($handle = opendir(".")) { 
     $lightbox = rand(); 

     $files = array(); 

     while (($file = readdir($handle)) !== false) { 
      if (!is_dir($file) && ($type = getPictureType($file)) != '') { 
       $files[] = $file; 
      } 
     } 

     natsort($files); 

     $has_previous = $skip != 0; 
     $has_next = (count($files) - $skip - $per_page) > 0; 

     $spliceLength = min($per_page, count($files) - $skip); 
     $files = array_slice($files, $skip, $spliceLength); 

     echo '<ul id="pictures">'; 

     foreach($files as $file) { 
      if (!file_exists('thumbs/' . $file)) { 
       $type = getPictureType($file); 
       makeThumb($file, $type); 
      } 

      echo '<li><a href="' . $file . '" class="zoom" rel="group">'; 

      echo '<img src="thumbs/' . $file . '" alt="" />'; 

      echo '</a></li>'; 
     } 

     echo '</ul>'; 
    } 
} 
+0

je suppose que je suis juste un noob complet je branche ceci dans getpictures mais maintenant rien ne se montre –

+0

Je viens de corriger une erreur, essayez encore –

+0

doux merci pour me tenir la main grâce à cette apprécier –

2

Vous n'utilisez même pas un tableau. Au lieu de faire écho à vos li lorsque vous les rencontrez, vous devez les placer dans un tableau, indexé par nom de fichier.

$output[$file] = '<li>etc</li>'; 

Puis, une fois votre boucle terminée, vous aurez besoin d'utiliser une fonction personnalisée pour faire une sorte clé naturelle, depuis natsort() de PHP ne fonctionne que sur des valeurs.

function natksort($array) { 
    $keys = array_keys($array); 
    natsort($keys); 

    $ret = array(); 
    foreach ($keys as $k) { 
     $ret[$k] = $array[$k]; 
    } 

    return $ret; 
} 

$output = natksort($output); 
echo '<ul>'; 
foreach ($output as $out) { 
    echo $out; 
} 
echo '</ul>'; 

Modifier

Wow, je trouve ce petit bijou à faire le tri:

uksort($array, 'strnatcasecmp'); 

Crédit: http://www.chipstips.com/?p=269

+0

putain je l'ai trouvé aussi. Je suis trop lent pour SO :( – rezzif

2

similair à hobodave mais je php utilisons construit en fonction natsort:


uksort($output, "strnatcmp");