Une variable variable en php!

Résolu/Fermé
dwighthaul Messages postés 11 Date d'inscription dimanche 9 août 2015 Statut Membre Dernière intervention 14 août 2015 - 12 août 2015 à 15:32
CptRomaiin Messages postés 315 Date d'inscription mercredi 23 octobre 2013 Statut Membre Dernière intervention 28 avril 2016 - 14 août 2015 à 13:46
Bonjour à tous, je suis en train de réaliser une fonction récursive pour afficher toues les musiques d'un fichier source.
De sorte que s'il rencontre un fichier musique il affiche un formulaire pour pouvoir le lire
Si c'est un dossier il le scan et relance la fonction, scan le dossier et ainsi de suite.

Le problème que j'ai c'est dans le nommage des fonctions 'scan'.

En gros j'aimerais bien avoir une variable de basse qui s'appelle scan pour le fichier mère(dossier musique),
scan1 pour un fichier fille du fichier mère (dossier artiste)
scan2 pour le fichier fille du fichier fille du fichier mère, et ainsi de suite (dossier album par exemple)...
et tout ça automatiquement dans une boucle récursive.
Faire une sorte de $variable = $scan.'$i';

Si quelqu'un à une idée pour faire ca, je suis preneur!

4 réponses

VanDog Messages postés 63 Date d'inscription vendredi 17 juillet 2015 Statut Membre Dernière intervention 11 février 2016 13
12 août 2015 à 15:54
Bonjour,

Étant très débutant dans ce langage je ne te promet rien quant à ma solution; mais ce que tu sembles vouloir faire ressemble drôlement à un tableau avec $i comme index. As-tu essayé ainsi ?
0
Utilisateur anonyme
12 août 2015 à 15:54
salut ,

Il faut simplement que tu crees les objet. Les objets parents qui contiendront un tableau d'enfants. Par exemple ton objet "album" aura un parametre qui correspondra a un tableau d'objet "musique".


Sinon tu peux aussi faire un simple tableau à n dimension.

L avantage de la classe sera d'avoir un nommage (par exemple avoir une variable "titre", ca donne plus de lisibilité).

Un petit tour ici t'aidera :

http://php.net/manual/fr/keyword.class.php


naga
0
dwighthaul Messages postés 11 Date d'inscription dimanche 9 août 2015 Statut Membre Dernière intervention 14 août 2015
12 août 2015 à 17:33
Ah oui! passer par des class, pas bête ça! J'y avais pas pensé. Et sais tu si on peut définir si c'est un dossier ou un fichier de type audio/mp3 directement sans passer par une variable?
Sinon j'ai fait un peu de java, il me semble que ça s'en ressemble!
0
Bah je dirai que pour le type tu peux chercker l'extension et pour determiner si c'est un repertoire ou un fichier tu as la fonction
is_dir
.

Et oui le principe de class est le même quelque soit le language ;)
0
dwighthaul Messages postés 11 Date d'inscription dimanche 9 août 2015 Statut Membre Dernière intervention 14 août 2015
Modifié par dwighthaul le 14/08/2015 à 09:49
Ok, merci pour la fonction is_dir, ça va bien me servir!
Par contre ça ne change pas mon problème de récursivité :/
si j'instancie un objet Dossier, et que j'appelle sa méthode afficher_dossier();
Avec un truc comme ça:

dossier = new Dossier();

dossier->afficher_dossier()
{
for($i=2; $i<=count($this); $i++)
if (is_dir($this[$i])
{
dossier2 = new Dossier();
dossier2->afficher_dossier()
}else{
// Programmation normal pour une musique

}
}


Si le 'dossier2' possède des dossiers lui aussi, alors il va demander d'instancier un nouveau dossier, 'dossier2'!
J'ai pas essayé mais je pense que ca va pas le faire!
Après j'ai réussi à faire une lecture sur 3 niveaux de dossier (dossier musique, dossier artiste, dossier album), mais bon à la main c'est pas très propre, j'aurais préférer du récursif, mais je suis bloqué par les noms :/
0
Utilisateur anonyme
14 août 2015 à 12:27
Salut ,

A mon avis il te manques quelques notions en objet.... Alors pour commencer une chose importante dans ton cas : le nom en lui même ne pause pas de problème entre un objet et ses sous objets; c'est à dire qui objet A pourra contenir un autre objet nommé A, accessible par A->A. (c'est pas super claire mais l idée étant que ton problème n en est pas un).


Ensuite un objet peut contenir un objet du même type (c'est a dire que si tu as une classe Repertoire , elle peut contenir un parametre Repertoire)


Je te conseil de te documenter un peu plus sur les listes chainées et les objets. Si j ai le temps je ferai un exemple mais ne compte pas trop dessus .

naga
0
Utilisateur anonyme
14 août 2015 à 13:22
voila un test qui pourra t aider :







class test{
var $sNom_ensemble = ""; //--correspond au nom courrant de cet objet
var $sous_Ensembles = array();//--ses sous ensembles


//--dim array est un tableau à n dimension.
function traiter( $Dim_array )
{
if(is_array($Dim_array))
{
foreach($Dim_array as $v)
{
$tmp = new test();
$tmp->traiter($v);
array_push($this->sous_Ensembles,$tmp);
}
}
else
{
$this->sNom_ensemble = $Dim_array;
}
}
}
$t1 = array("a", "b");
array_push($t1, "c", "d");
$t2 = array("e", "f");
array_push($t2, "g", "h");
$t3 = array("i", "j");
array_push($t3, "k", "l");
$t4 = array($t1,$t2);
$ArrayTest = array($t3,$t4);

$Letest = new test();

$Letest->sNom_ensemble = "ensemble de base";
$Letest->traiter($ArrayTest);
var_dump($Letest);



naga
0
CptRomaiin Messages postés 315 Date d'inscription mercredi 23 octobre 2013 Statut Membre Dernière intervention 28 avril 2016 58
14 août 2015 à 11:50
Salut,

Alors pour information ce que tu voulais faire au départ, si j'ai bien compris, existe en PHP. Il est possible de créer une variable avec un nom dynamique de cette manière :

$i = 5;
${"test".$i} = "Test"; // Création d'une variable nommée $test5
echo $test5; // Appel de la variable

Cependant je te conseil plutôt d'utiliser des tableaux et/ou des objets pour effectuer ce genre de chose comme ça t'a été indiqué plus haut. Avec des variables ayants des noms dynamiques le code devient très vite lourd et illisible.
0
Utilisateur anonyme
14 août 2015 à 12:29
heu dans son cas l'indirection est pas utile, je pense que tu as du te tromper ^^
0
CptRomaiin Messages postés 315 Date d'inscription mercredi 23 octobre 2013 Statut Membre Dernière intervention 28 avril 2016 58
14 août 2015 à 12:35
Effectivement ce n'est pas très utile mais comme il a posé la question dans son premier post j'y répond, ça peut servir à d'autres ;)
0
Utilisateur anonyme
14 août 2015 à 13:27
ah oui en effet ^^ je ne l avais pas "noté" car l'utilisation d un tableau est largement suffisant (il se compliquera le tout avec des indirections) ... en fait de manière generale je ne les utilises que pour ce qui concerne l'ihm, dans le cas de variables je trouve que ca n a pas vraiment d interêt (ou en tout cas je ne vois pas ... sauf pour des appels de dll externe peu être mais jamais fais en php =P)
0
CptRomaiin Messages postés 315 Date d'inscription mercredi 23 octobre 2013 Statut Membre Dernière intervention 28 avril 2016 58
14 août 2015 à 13:46
Oui je suis d'accord avec toi, moi je ne les utilises pas du tout, il y toujours (ou presque ^^) un moyen de faire autrement :-)
0
dwighthaul Messages postés 11 Date d'inscription dimanche 9 août 2015 Statut Membre Dernière intervention 14 août 2015
Modifié par dwighthaul le 12/08/2015 à 15:50
<?php
if(isset($_GET['musique_name']))
{
$musique_name=trim($_GET['musique_name']);
?>
<audio type="audio/mp3" src="musiques/<?php echo $musique_name ?>" autoplay controls></audio>
<?php
}
function musique($scan)
{
for($i=2; $i<=count($scan); $i++)
{
if(!empty($scan[$i]))
{
$bool =stristr($scan[$i],'.mp3');
if ($bool=='.mp3')/*Donc c'est une musique, on affiche le fichier de lecture, peperre!*/
{
echo $scan[$i];
?>
<form action="test2.php" method="GET">
<input type="hidden" name="musique_name" value="<?php echo 'musiques/'.$scan[$i]; ?>">
<input type="submit" value="Lire">
</form>
<?php
}else{
echo '<fieldset>';
echo '<legend>'.$scan[$i].'</legend>';
$scan2 = scandir('musiques/'.$scan[$i]);
musique($scan2);
echo "<br/></fieldset>";
}
}
}
}
$scan = scandir("musiques");
musique($scan);

?>



voila mon php si c'est plus clair!
-1