Petit coup de pouce, boucle foreach ?

alx
Invité n'ayant pas de compte PHPfrance

23 févr. 2012, 20:13

Bonjour à tous,
Je suis débutante et je rencontre quelques problème en ce qui concerne un exo, je ne trouve pas de solution et recherche un coup de pouce :)

J'ai un tableau comme ceci :
$ext = array
('mp3','mp3','mp3','jpg','docx','docx','jpg','xlsx','xlsx','docx','xlsx','mp3'); // Extensions dans le désordre
$nbext=12;
Et je cherche à obtenir ce rendu :
Nombre de total de fichiers : ... (réussi)
Nombre de fichiers texte : ... (réussi)
Nombre de fichiers musique : ... (réussi)
Nombre de fichiers tableur : ... (réussi)
Nombre de fichiers image : ... (réussi)
Fichiers les plus nombreux : 'son/image/...' ('mp3/docx/...' = 'le nombre')
Fichiers les moins nombreux : 'son/image/...' ('mp3/docx/...' = 'le nombre')

Je bloque donc sur la fin sans comprendre comment afficher l'extension en quesetion (mp3, docx, xlsx ou jpg)

C'est pourquoi je solicite un coup de main de votre part à vous les pros :) et pourquoi pas une petite explication ^^

D'avance je vous remercie !

ViPHP
xTG
ViPHP | 7331 Messages

23 févr. 2012, 20:21

Tu peux tester l'extension d'un fichier en isolant l'extension comme suit :
$chemin_fichier = '/dir/dir2/test.txt';
$array = explode('.', $chemin_fichier);
$extension = $array[count($array) - 1];
Tu n'as plus qu'à comparer avec les valeurs statiques que tu as dans ton array.

En gros il va te falloir durant le parcours incrémenter des compteurs par type.
Ensuite ça ne sera que trouver le plus gros ou le plus petit compteur. ;)

Eléphant du PHP | 179 Messages

23 févr. 2012, 20:22

hello :),
peut-on voir ce que tu as déja fais sur les sujets ou tu bloques ? ce serait plus simpas de prendre ce que tu as commencé comme base pour que tu comprennes ;)

ps: si tu veux récupérer la clef d'un tableau, tu peux agir de la façon suivante :
foreach($array as $key=>$value)
{
// code
}

alx
Invité n'ayant pas de compte PHPfrance

23 févr. 2012, 20:30

J'ai trouvé une solution qui fonctionne mais selon moi ce n'est pas la bonne, trop compliqué et longue.
Je vous le communique :
echo "Nombre total de fichiers : ".count($ext); // Je compte le nombre d'éléments présents dans le array. J'aurais aussi pu afficher la variable $nbext

$mp3 = 0; // J'initie des variables compteurs pour les différents types de fichiers
$jpg = 0;
$docx = 0;
$xlsx = 0;

for ($i=0;$i<(count($ext));$i++) { // Parcours du tableau $ext
switch($ext[$i]) { //Exprime la possibilité d'avoir différents cas, à savoir les différents éléments
case ($ext[$i] == 'mp3'): $mp3 ++ ; break ; // Je compte chaque type d'extension en alimantant un compteur
case ($ext[$i] == 'jpg'): $jpg ++ ; break ;
case ($ext[$i] == 'docx'): $docx ++ ; break ;
case ($ext[$i] == 'xlsx'): $xlsx ++ ; break ;
}
}

echo "</br>Nombre de fichiers de traitement de texte : ".$docx."</br>Nombre de fichiers de tableur : ".$xlsx."</br>Nombre de fichiers d'image : ".$jpg."</br>Nombre de fichiers de musique : ".$mp3;

$max = max ($mp3,$jpg,$docx,$xlsx); // Je détermine quels types d'extensions sont les plus ou les moins nombreuses
$min = min ($mp3,$jpg,$docx,$xlsx);


$compt = array ( // Tableau associatif, associant un genre à chaque comptage d'extension
'musique' => $mp3,
'image' => $jpg,
'document' => $docx,
'tableur' => $xlsx);
$lien = array ( // Tablleau associatif, associant un genre à chaque dénomination d'extension
'musique' => 'mp3',
'image' => 'jpg',
'document' => 'docx',
'tableur' => 'xlsx');

foreach ($compt as $type => $comptext) { // Parcours du premier tableau
if ($comptext == $max) { // Recherche du type d'extension le plus élevé dans la liste
echo "</br>Fichiers les plus nombreux : ".$type." ( ";
foreach ($lien as $genre => $extension){ // Recherche de la dénomination de l'extension associé au type de celle-ci (ex : mp3 associé à musique)
if ($genre == $type) {
echo $extension." = ".$comptext.")";
}
}
}
if ($comptext == $min) { // Idem avec les valeurs minimums
echo "</br>Fichiers les moins nombreux : ".$type." ( ";
foreach ($lien as $genre => $extension){
if ($genre == $type) {
echo $extension." = ".$comptext.")";
}
}
}
}
Merci à vous de m'assister en tout cas ;)

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

23 févr. 2012, 20:41

Image (ben quoi... c'est un coup de pouce que tu voulais, non ? 8-| )

Plus sérieusement, ce qui est bien avec les exercices, c'est qu'ils ont généralement une certaine logique. Si tu arrives à compter le nombre de fichier "texte", tu peux le comparer au nombre de fichiers "musique" pour savoir s'il y a plus de fichiers textes ou musiques. Une fois que tu le sais, tu peux comparer celui-ci au nombre de fichiers "tableurs" pour savoir s'il y a plus de fichiers tableurs que de fichiers que t'as le plus entre texte et musiques etc.

A la fin tu devrais savoir quels sont les plus nombreux (et si accessoirement tu consignes également le plus petit des deux nombres de fichiers, tu dois pouvoir trouver les moins nombreux par la même occasion :))

Edit : ah ben trop tard :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 179 Messages

23 févr. 2012, 20:51

foreach ($compt as $type => $comptext) 
{ // Parcours du premier tableau
    if ($comptext == $max) 
    { // Recherche du type d'extension le plus élevé dans la liste
        echo "</br>Fichiers les plus nombreux : ".$type." ( ";	
        echo $lien[$type]." = ".$comptext.")";
    }
    if ($comptext == $min) 
    {	// Idem avec les valeurs minimums
        echo "</br>Fichiers les moins nombreux : ".$type." ( ";	
        echo $lien[$type]." = ".$comptext.")";
    }
}
C'était pas si mal :)
à part la fin ou tu vas boucler pour rien, je t'ai un peu opti ta dernière boucle déja ;)

alx
Invité n'ayant pas de compte PHPfrance

23 févr. 2012, 20:57

Enfin quelque chose de plus simple !!
Merci Thibaud C !! Et les autres pour avoir pris la peine de regarder mon soucis !

Je pense que ce sera pas mal et en plus j'ai pigé ce que tu as fait :)

Merci beaucoup pour ce déblocage ! Le php c'est quand même pénible quand on bloque !

Mammouth du PHP | 2278 Messages

23 févr. 2012, 22:02

Il n'y a pas grand chose où, quand on bloque, ce ne soit pas pénible.
Avoir un exo juste, c'est bien, l'avoir résolu, c'est mieux, être capable d'extrapoler c'est le top.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD