Selection Fichier par nom - PHP

10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012 - 21 oct. 2011 à 18:50
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012 - 31 oct. 2011 à 12:05
Bonjour à tous

Voilà je suis à la recherche d'un script PHP qui me permettrais d'afficher uniquement les fichiers commençant par une indication particulière.

exemple:
Afficher fichier commençant par "01_";
Sortie ->
-O1_01.JPG
-01_02.JPG
...

Il me semble que c'est réalisable mais je ne me rappelle plus comment faire ?
Si quelqu'un a une idée. Merci d'avance.

nomad

19 réponses

cod57 Messages postés 1654 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 20
21 oct. 2011 à 19:34
bonsoir
<?php
function listerFichier($dir=null,$commencepar){
$s=strlen($commencepar);
static $liste;
static $files;
$liste=null;
$files=array();

$files[] =glob($dir.'/*');
//ou $dir.'/*.jpg'            /
  //echo '';
  //print_r($files);
 
  $c = count($files);
  
  for($i=0;$i<$c;$i++){
  
      foreach($files[$i] as $k => $v){
         
         if(isset($v) && !empty($v) && substr($v,strlen($dir)+1,$s)===$commencepar){  
         
         $v = str_replace($dir.'/','',$v);
         $liste.= $v.'
'; 
                         
         }else{
         }
      
      }
  
  }
return $liste;
}


echo listerFichier('repertoire','to');
/*to ou autre chose*/

?>


Bonne programmation !
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
22 oct. 2011 à 01:40
Salut,

Spécialement pour toi cod57 :D


Et je reprend ta fonction pour illustrer mon propos :
<?php

function listerFichier($dir, $commencepar) {
  $lst = scandir($dir);
  if ($lst === false)
    return false;

  $len = strlen($commencepar);
  $cmp = function($elem) use ($commencepar, $len) {
    return strncmp($commencepar, basename($elem), $len) == 0;
  };

  return array_filter($lst, $cmp);
}

var_dump(listerFichier('./','toto'));

?>

Et voilà comment avec quelques fonctions on arrive a ses fins très rapidement, sans se compliquer la vie, et en gérant les erreurs en plus ! Soit dit en passant, le echo d'un array c'était pas top ;p

Pour ceux qui se demandent le pourquoi du comment :
Avec scandir(), on obtient dans un array la liste de tous les fichier du dossier passé en paramètre, ou false s'il y a une erreur, d'où le test pour sortir de la fonction s'il y en a une. Il ne nous reste plus qu'a retirer de ce tableau les fichiers dont le nom ne commence pas parce que l'on souhaite, pour ceci la fonction array_filter() est toute indiquée. Il nous suffis de lui passer une fonction de rappel capable de prendre en paramètre un élément du tableau et de retourner true s'il faut garder l'élément, sinon false. Il suffis donc de créer cette callback, et vu que nous n'avons strictement aucun intérêt à faire une "véritable" fonction avec un nom, nous nous contenterons d'une function anonyme assignée à une variable pour que le code soit plus clair. Dans cette fonction, on utilise :
- basename() afin d'être certain d'avoir le nom du fichier sans aucun truc louche.
- strncmp() afin de comparer les premiers caractères du nom du fichier avec ce que l'on veux.
Au sujet de cette comparaison, on utilise use afin que notre fonction anonyme connaisse cette chaîne de caractères par laquelle nos noms de fichiers doivent commencer. Et vu que l'on a besoin de la longueur de cette chaîne, autant la calculer une seule fois avant et la passer également.

Et voila, le tour est joué, on a un code simple, efficace et super facile a maintenir et faire évoluer. Enjoy :-)
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
22 oct. 2011 à 02:10
PS : on me chuchote dans l'oreille que sinon il y a glob($dir . '/' . $commencepar . '*');
mais c'est carrément moins fun et ça ne permet pas de montrer la puissance des callback :D
0
cod57 Messages postés 1654 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 20
22 oct. 2011 à 09:34
bonjour

@TychoBrahe merci pour l'image ... c'est vrai que ta fonction est plus jolie et c'est bien aussi que tu présentes une autre solution j'ai mis ton exemple dans mes favoris

++
Bonne programmation !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012
25 oct. 2011 à 17:41
Bonjour à tous

Tous d'abord je remercie tous le monde pour ces petits conseils très précieux.
Néanmoins à force de travail je n'arrive toujours pas au résultat que je recherche.

J'ai fait des essais avec le script de TychoBrahe et de Code57 mais en vain (et je viens de faire une après-midi complète sur la fonction "glob").

Alors en fait le but de mon script était d'afficher des images et des textes dans un même dossier portant le même préfix

exemple:

01.TXT
01_01.jpg
01_02.jpg
02.TXT
02.01.jpg
.....

Malgré toute mes recherches sur internet et de bidouillage de code je ne parviens pas ce résultat. Ce qui me serait fort utile je pense est de pouvoir filtrer le "readdir" que j'ai dans un while ->

while($element = readdir($dir)) {
if($element != '.' && $element != '..') 
{
if (!is_dir($dir_nom.'/'.$element)) 
{
$tabfichier[] = $element;
}
else 
{
$dossier[] = $element;
}
}
}

closedir($dir); 


mais même en remplaçant par ->

if($element != '.txt' && $element != '..')


...j'ai du mal. Si quelqu'un à une suggestion je suis preneur.

Merci d'avance.
nomad & wild [  ]
0
cs_nemo_1 Messages postés 60 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 26 octobre 2011
26 oct. 2011 à 11:51
Chalute,

Voilà ce que je te propose:

<?php
    function commence_par($dir, $prefixe="01"){
       return (substr($dir, 0, 2) == $prefixe);
    }
    $dir_name = "tondossier";
    if($dir_list = scandir($dir_name)){
       var_dump(array_filter($dir_list, "commence_par"));
    }
?>


Tu met juste le prefixe soit manuellement (01, 02, 03) soit tu lui passe un array avec tes prefixes et il taffiches le contenu du dossier commencant par ce prefixe.

A la fin, je fais un var_dump pour te montrer que tu auras bien ces fichiers là dans un array() que tu peux exploiter comme bon te semble.

J'espère t'avoir aidé :).

Bon courage
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
26 oct. 2011 à 14:42
Salut,

@10demon10 : Tout mélanger c'est juste mauvais. Essaye donc de nager avec les bras effectuant des mouvement de nage indienne, la jambe gauche en crawl et la droite en brasse. Je te promet que tu ne vas pas tenir longtemps et couler vite fait. Ici c'est pareil, si tu veux "bidouiller" plusieurs méthodes totalement différentes qui n'ont strictement aucun rapport, tu ne peux pas y arriver. Choisis l'une ou l'autre mais pas les deux. Pour info, dans ce que je t'ai passé tu as juste à modifier la fonction anonyme qui permet de savoir si un fichier correspond à ce que tu cherches. Vu que tu veux juste des images, tu peux vérifier l'extension en plus du préfixe mais également le type mime par exemple.


@nemo_1 : dit moi, à part rajouter des bugs et enlever des fonctionnalités de ce que j'ai posté plus haut tu as fait quoi exactement ? Allez on va regarder de plus prêt ce que tu as mis :

if($dir_list = scandir($dir_name)){

Une jolie bêtise que ceci. Lorsqu'un array vide est converti en bool, il est convertis à false. Avec ce genre de choses, tu traite un retour normal de la fonction (tableau vide) exactement au même titre qu'un retour anormal (false) indiquant une erreur... dans pas mal de code c'est le genre d'erreur bête qui introduit des "bug mystiques". Après, dans le cas présent, je t'accorde que scandir() n'a presque aucune chance de retourner un tableau vide vu que la quasi totalité des OS actuels considèrent qu'un dossier contient au moins deux fichiers, à savoir . et .. représentant respectivement le dossier courant et le dossier parent. Cependant, si tu commences à ne pas être rigoureux ça va te jouer des tours et tu t'en mordras les doigts. Si tu voullais vraiment faire ça en une ligne, tu aurais du faire ceci, mais perso je trouve cette notation franchement lourde à lire :
if(($dir_list scandir($dir_name)) false)


Maintenant un autre point :
function commence_par($dir, $prefixe="01"){
return (substr($dir, 0, 2) == $prefixe);
}

Il sert a quoi ton paramètre optionnel $prefixe ? Réponse : strictement à rien. Vu ta manière d'appeler la fonction tu ne peux pas lui passer de paramètres et donc il sera toujours à sa valeur par défaut, passez moi l'expression mais c'est franchement con. Dans le même genre on notera le 2 mis en dur dans le substr(), encore une bêtise vu que du coup, si on change de préfixe pour un autre d'uen autre longueur le code ne fonctionne plus.
Tant que j'y suis j'en profite pour tapper sur l'utilisation d'une fonction nommée. C'était quoi l'intérêt de ne plus utiliser une fonction anonyme ? Si jamais tu comptes la réutilsier autre part, ok. Mais vu comment elel est faite je doute qu'elle soit vraiment générique et réutilisable dans d'autres cas...
0
cs_nemo_1 Messages postés 60 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 26 octobre 2011
26 oct. 2011 à 15:50
Chalute TychoBrahe,

je vais essayer de te répondre malgré tes insultes, j'ai une grandeur d'esprit pour celà.

J'apporte ma contribution, si elle est fausse je m'excuse je n'ai pas eu le temps de le tester je l'ai construite à la hate.

maintenant si je peux me permettre, sort un peu, respire de l'air je pense que tu en auras grandement besoin.
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
26 oct. 2011 à 16:08
Salut,

maintenant si je peux me permettre, sort un peu, respire de l'air je pense que tu en auras grandement besoin

On va dire que tu as écrit ça à la hâte et sans avoir le temps de tester ;)
0
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012
26 oct. 2011 à 19:18
Merci beaucoup pour vos informations je vais tester plus attentivement.
0
samu_ham Messages postés 19 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 12 janvier 2019 1
28 oct. 2011 à 21:18
bonsoir
je debute en php premierement je tien a filicité l'equipe qui ont realiser ce forume :

-faire de code par etape example background ,footer ,header etc , jai boucoup de problem a afficher sur la méme page comment l'organiser le code php step by step

merci a vous
0
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012
31 oct. 2011 à 10:46
TychoBrahe il a un petit bug dans la conception de ton code j'obtient ça en l'utilisant.

Parse error: syntax error, unexpected T_FUNCTION
sur la fonction ->
$cmp = function($elem) use ($commencepar, $len) 
  {
    return strncmp($commencepar, basename($elem), $len) == 0;
  };


Aurait-tu une suggestion ?


ps: Samu_ham je te conseil de regarde les tutoriels en PHP du site ils sont très bien fournis (step by step).
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
31 oct. 2011 à 10:51
Ce que j'ai mis fonctionne parfaitement avec PHP 5.3. Vérifie donc ta version de PHP, peut être utilises-tu une vielle version qui ne supporte pas encore ceci.
0
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012
31 oct. 2011 à 11:02
j'ai la 5.2.17 ?


nomad & wild [  ]
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
31 oct. 2011 à 11:25
En effet, d'après Wikipedia cette manière de déclarer des fonction anonymes est apparue en PHP 5.3 et tu ne peux donc pas l'utiliser en 5.2. C'est dans ces moment là qu'on aimerais bien déclrer une focntion nommée dans el scope de notre fonction et utiliser la curryfication afin d'en créer dynamiquement une autre qui connaisse les deux variables qu'il n'est pas possible de passer avec array_filter().

En attendant de trouver une solution efficace, tu prend le seul et unique glob() comme j'ai mis dans mon second post dans ce sujet, ça t'évitera de te casser la tête.
0
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012
31 oct. 2011 à 11:31
Merci pour la rapidité des précisions TychoBrahe.
0
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012
31 oct. 2011 à 11:42
Je vais juste t'embêter une dernière fois pour la fonction glob()
qui marche bien:

$dir = "mondossier";
foreach(glob( $dir.'/'.'*.txt',GLOB_NOSORT) as $file)  
{  
    
$fd = @fopen($file,"r");
if (!$fd) die("Impossible d'ouvrir le fichier");
    		while (!feof($fd)) 
    		{
                   // boucle pour la lecture des fichiers fichiers txt.
    		}

}


Mais j'aimerais pouvoir utiliser une autre fonction donc glob() dans la boucle pour donc afficher les images qui m'intéresse et qui reste en correspondance avec l'article.

Donc lire le nom de fichier image et si il est égale à 001 alors afficher pour le premier article lu, etc...

Comment pense tu que je pourrais m'y prendre ?
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
31 oct. 2011 à 11:47
Je ne comprend pas très bien ce que tu essayes de faire là.
0
10demon10 Messages postés 63 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 28 juin 2012
31 oct. 2011 à 12:05
Dans mon script j'ai

- un foreach(): pour chaque fichier avec l'extension ".txt" va ouvrir le fichier (dans l'ordre croissant "abcdefg...")

- un if(): si le fichier s'ouvre correctement me fait une boucle pour lire chaque ligne de mon fichier texte (j'ai omis le code pour faire plus court mais c'est surtout pour controler chaque ligne de lecture et faire une belle présentation).

Je souhaiterais juste ajouter les images appropriées pour chaque fichier texte qui s'affiche un peu comme un blog.

1 fichier txt + images = 1 articles + images

Je souhaiterais donc récupéré le nom du fichier (001.txt -> 001) et le faire correspondre pour afficher les bonnes images (001_a.jpg, 001_b.jpg,...)

if nomfichier = 001
alors afficher image commençant par 001

Donc je pensais rajouter une fonction avec glob() quelque part dans le code (mais je sais pas ou exactement) pour trier mes images.

ps: désolé j'ai un peu de mal à m'exprimer, mais si tu peu imaginer le principe de "texte + image" le reste est simple je pense.
0