Comment compter fichiers par nom ?

Gunner1976
Invité n'ayant pas de compte PHPfrance

30 janv. 2012, 13:54

Bonjour,
Voila, dans un dossier j'ai
orange_01
orange_02
...
orange_20

bleu_01
bleu_02

rouge_01
rouge _02
...
rouge_15

J'aimerai pouvoir afficher soit le nombre de fichier propre à chaque nom (20 pour orange, 2 pour bleu, 15 pour rouge), soit la dernière occurence (orange_20, bleu_02, rouge_15).

Je ne sais pas du tout comment je peux faire ça...
est-ce possible, et si oui, via quelle commande ?

Merci beaucoup

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 janv. 2012, 14:08

salut,

tous est possible :)

Si le motif est toujours le même nom_xx.ext
tu peux le faire facilement :
- La fonction glob pour lister le contenu du répertoire ciblé
- la fonction foreach pour parcourir le tableau.
- la fonction explode ou preg_match
suivant le cas, deux explode, un sur le _ pour séparer nom et N°+ext et une pour séparer N° et extension
A partir de la tu gère un tableau résultat avec en index le nom du fichier, un test avec isset pour savoir si l'index existe ou pas (s'il existe pas tu insère avec en valeur zéro) et derrière un incrément ($var++).

Tu peux aussi utiliser les classe de spl, comme la classe DirectoryIterator pour simplifier un peu la chose. (ou pas).

@+
Il en faut peu pour être heureux ......

Gunner1976
Invité n'ayant pas de compte PHPfrance

30 janv. 2012, 18:27

Merci de cette piste.

Alors si je comprends bien c(est toujours le même schéma comme tu l'as deviné : nom_xx.jpg) :

Code : Tout sélectionner

<?php $root = "images"; foreach (glob("$root/*.jpg") as $filename) { $name = explode("_", $filename); } ?>
Ai-je bon pour le moment ?
Je ne vois pas comment séparer les numéros à deux chiffres du reste en passant par explode...
Pas plus que comment je peux mettre le nombre d'orange et de bleu... j'ai du rater quelque chose... serait-ce possible d'avoir un coup de pouce supplémentaire ?
Merci beaucoup.

ViPHP
xTG
ViPHP | 7331 Messages

30 janv. 2012, 18:38

Bah tu les sépares déjà avec ton explode. :roll:
Regardes donc ce que te retournes la fonction.

Gunner1976
Invité n'ayant pas de compte PHPfrance

31 janv. 2012, 15:36

Bonjour,

Voici ce que ça renvoie :
Array ( [0] => images/orange [1] => 3.jpg

j'ai rajouté un

Code : Tout sélectionner

$taille =count($name); echo 'La taille du tableau est :'.$taille;
mais ça me met :
La taille du tableau est :2

A noter que durant le test j'avais bien toutes les images dans le dossier, or c'est toujours orange_03.jpg qui s'affiche au niveau du Array.

Je n'y comprends rien du tout... :cry:

gunner1976
Invité n'ayant pas de compte PHPfrance

02 févr. 2012, 16:18

Bonjour,
Personne ne peut m'aider ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 févr. 2012, 17:11

C'est quoi le code testé ?
Il en faut peu pour être heureux ......

gunner1976
Invité n'ayant pas de compte PHPfrance

02 févr. 2012, 19:10

Celui-ci :

Code : Tout sélectionner

<?php $root = "images"; foreach (glob("$root/*.jpg") as $filename) { $name = explode("_", $filename); }
avec un print_r pour l'affichage, ce qui me renvoie ceci :
Array ( [0] => images/orange [1] => 3.jpg

Merci.

ViPHP
xTG
ViPHP | 7331 Messages

02 févr. 2012, 19:43

Aucun affichage dans ce code...
Et à mon avis tu n'as pas compris le fonctionnement d'une boucle.
Ton affichage se trouve en dehors de la boucle c'est ça ? Donc $name prend la dernière valeur de la boucle...
Car à chaque itération de la boucle $name est écrasée.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 févr. 2012, 20:06

bon aller je suis sympa, ça ce fait en 12 lignes
<?php
$directory = 'images';
$filenames = array();
$iterator = new DirectoryIterator($directory);
    foreach ($iterator as $fileinfo) {
        if ($fileinfo->isFile() && $fileinfo->getExtension()== 'png') {
            $f = substr($fileinfo->getFilename(),0,strrpos($fileinfo->getFilename(),'_'));
            if (isset($filenames[$f]))
                $filenames[$f]++;
            else 
                $filenames[$f] = 1;
        }
    }
    echo '<pre>';
    var_dump($filenames);
    echo '</pre>';
?>
ce qui donne
array(2) {
["logo_tuxcopy095048"]=>
int(17)
["mcd_exemple"]=>
int(11)
}
Il en faut peu pour être heureux ......

Gunner1976
Invité n'ayant pas de compte PHPfrance

06 févr. 2012, 12:03

Bonjour,
Je te remercie beaucoup pour le code.
Je suis d'accord avec toi, je crois aussi que je ne maitrise pas du tout les boucles... à chaque fois que je dois en employer une je galère... malgré mes efforts PHP me semble toujours obscur, mais bon... je ne désespère pas (je devrai peut etre remarque ! :mrgreen: )

Merci encore, sujet classé =D>