[PHP] Trouver le fichier dernièrement modifié commençant par...

Trouver le fichier dernièrement modifié commençant par... [PHP] - PHP - Programmation

Marsh Posté le 02-06-2011 à 18:22:00    

Bonjour  :hello:

 

Contexte : J'ai réalisé quelques tutoriels découpés pour quelques uns d'entre eux en plusieurs pages. Le nom des pages est rigoureux. Il est du type :

tuto-001-blablabla


Qui s'interprète comme : blablabla est le nom du tuto. C'est le tuto numéro 001.
Mon but est d'avoir en première page de mon tuto la date de MAJ. Cette date n'est autre que la date la plus récente de modification sur l'ensemble des pages du tutoriel désigné.

 

Mon algorithme, c'est là que je coince un peu. Il le faudrait le plus léger possible pour le serveur, reste que je connais mal les fonctions existantes en PHP. Dans l'idée :

 

1. Relever la première partie de l'URL


$url = basename($_SERVER['REQUEST_URI']);
$url_numero = substr($url,0,7);

 

2. Lister l'ensemble des fichiers commençant par $url_numero, et identifier celui qui a été le plus récemment modifié.

 

3. Relever la date de dernière modification de ce fichier.


$date = date("d/m/y", filemtime($fichier_en_question));

 

Le problème est pour moi cette partie 2. Je ne vois pas quels outils de PHP utiliser (et de manière intelligente, c'est  à dire sans utiliser 2 ou 3 boucles imbriquées :whistle: ).

 

Je suis preneur de toute piste. Merci d'avance.  :jap:  

Message cité 1 fois
Message édité par Cver1 le 02-06-2011 à 18:24:30
Reply

Marsh Posté le 02-06-2011 à 18:22:00   

Reply

Marsh Posté le 02-06-2011 à 20:10:22    

Cver1 a écrit :

Je ne vois pas quels outils de PHP utiliser (et de manière intelligente, c'est  à dire sans utiliser 2 ou 3 boucles imbriquées :whistle: ).

Les boucles constituent une solution intelligente, car c'est de la programmation simple à faire et à relire.
Et, au contraire, chercher des fonctions peu connues, peu portables, avec l'obligation de lire la doc pour les paramètres que l'on ne connait pas par coeur, chercher des sortes de regex complexes, etc, sont des solutions stupides.
C'est le vieux billgatesanonym avec 25 ans d'expérience qui vous le dit.


Message édité par billgatesanonym le 02-06-2011 à 20:11:32
Reply

Marsh Posté le 02-06-2011 à 20:51:01    

Tu as sans doute raison. Mais je me dis que la tache que je cherche à faire est sans doute très simple pour un habitué. Et peut être qu'une fonction bien connu des programmeur existe. C'était le sens de ma phrase. Mais il est très probable que je me trompe. :d

Reply

Marsh Posté le 03-06-2011 à 16:48:22    

Up du jour.  [:chupachupz]

Reply

Marsh Posté le 04-06-2011 à 03:28:13    

J'ai réussi...  [:tyl]

 

Dans l'esprit voila ce que ça donne :

 


<?php
    $files = array();                       // le tableau qui contiendra l'ensemble des noms de fichier commençant par tuto-001 (pour l'exemple)
    $date = array();                        // le tableau de l'ensemble des dates de modification des fichiers du dit tuto
    $files = glob("tuto-001*" );            // on remplit le tableau $files avec les noms de fichier commençant par tuto-001
    for($i=0; $i<count($files);$i++)        // boucle sur le nombre d'entrée du tableau
    {
        $date[$i] = filemtime($files[$i]);  // on attribue les valeurs à $date
    }
    echo date("d/m/y", max($date));         // on cherche la valeur maximum de date que l'on passe ensuite dans un format lisible.
?>

 

Y'a plus qu'à remplacer "tuto-001" par une variable, transformer ça en fonction et basta...

 

C'était trivial si on connaissait l'instruction glob.

 

Merci pour vos lectures du sujet. :jap:


Message édité par Cver1 le 04-06-2011 à 03:32:48
Reply

Marsh Posté le 06-06-2011 à 16:02:34    

Petite optimisation :
puisque tu es dans une boucle, tu peux directement récupérer le max($date) sans faire appel à la fonction max. Car là, ça fait une boucle pour créer le tableau, et une deuxième boucle pour en chercher le max

Code :
  1. //$files = array(); Pas nécessaire vu que l'on initialise $files juste en dessous
  2. //$date = array(); Plus nécessaire
  3. $files = glob("tuto-001*" );
  4. $last_date = -1; // initialisation de last_date
  5. // foreach plus lisible que for
  6. foreach($files as $file){
  7.  $file_date = filemtime($file);
  8.  if($file_date > $last_date){
  9.    $last_date = $file_date;
  10.  }
  11. }


Message édité par Paulp le 06-06-2011 à 16:02:48
Reply

Marsh Posté le 08-06-2011 à 09:10:17    

Merci. :)
 
Je vais donc faire ainsi, c'est mieux en effet. Merci pour ce conseil. :jap:


Message édité par Cver1 le 08-06-2011 à 09:26:15
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed