Selection Fichier par nom - PHP

Signaler
Messages postés
63
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
28 juin 2012
-
10demon10
Messages postés
63
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
28 juin 2012
-
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

Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
10
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 !
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
11
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 :-)
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
11
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
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
10
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 !
Messages postés
63
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
28 juin 2012

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 [  ]
Messages postés
60
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
26 octobre 2011

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
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
11
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...
Messages postés
60
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
26 octobre 2011

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.
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
11
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 ;)
Messages postés
63
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
28 juin 2012

Merci beaucoup pour vos informations je vais tester plus attentivement.
Messages postés
19
Date d'inscription
mardi 6 avril 2004
Statut
Membre
Dernière intervention
12 janvier 2019
1
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
Messages postés
63
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
28 juin 2012

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).
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
11
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.
Messages postés
63
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
28 juin 2012

j'ai la 5.2.17 ?


nomad & wild [  ]
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
11
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.
Messages postés
63
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
28 juin 2012

Merci pour la rapidité des précisions TychoBrahe.
Messages postés
63
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
28 juin 2012

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 ?
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
11
Je ne comprend pas très bien ce que tu essayes de faire là.
Messages postés
63
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
28 juin 2012

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.