[PhP] Tableau multidimmentionnel dynamique... [Résolu/Fermé]

Signaler
-
 InFactITry -
Bonjour,

Je travail actuellement sur un projet personnel qui me pose un problème algorithmique.
Tout d'abord, bien que j'ai un bon niveau en programmation, j'ai un problème personnel avec les tableaux (un coup je les maitrises un coup je confond tout...).

Bon, une partie de mon application nécessite un explorateur. Bon je sais le faire simplement en parcourant le dossier concerné à l'aide d'une fonction en php. Le problème c'est que celà donne un résultat trié par ordre alphabétique (donc les dossiers et fichiers sont mélangés).

Pour faire ça un peu plus proprement, je voudrais utiliser un tableau à X dimensions, la première étant le dossier le plus haut, et la dernière correspondant aux fichiers du dernier sous-dossier.

Je met à votre disposition les parties de code déjà fonctionnel. Merci de me répondre clairement, et si vous postez des codes, svp commentez-les.

Merci d'avance.

<?php

function explorerDossier($path) {

// On ouvre le dossier envoyer à la fonction
// Et on renvoie une erreur si l'ouverture échoue
$media = opendir($path) or die('<p>Erreur lors de l\'ouverture de: ' . $media . '...</p>');

	// Tant qu'il y a des entrees on traite
	while($entree = readdir($media)) {
		// On élimine les dossiers racine (.) et retour (..)
		if(($entree != '.')&&($entree != '..')) {
			// Si la variable entrée correspond à un dossier
			// On l'affiche, et on ré éxécute la fonction pour ce dossier
			// Sinon on se contente de l'afficher
			if(is_dir($path.'/'.$entree)) {
				echo '<ul><img src="Media/Images/Defaut/dir_icon.gif" alt="Dossier - " class="imgExplorateur" /><h1>' . utf8_encode($entree) . '</h1>';
				explorerDossier($path . '/' . $entree);
				echo '</ul>';
			}
			else {
				echo '<li>';
				// On va aussi mettre une petite image perso pour
				// Les extensions de fichiers les plus courants
				// On récupère la partie du nom de fichier à partir du point
				$extension = strrchr($entree,'.');
				// Puis on supprime le point
				$extension=substr($extension,1) ; 
				
				// On généralise les extensions
				// Joint Photographic Experts Group: *.jpg, *.jpeg, *.jpe
				// Graphics Interchange Format: *.gif
				// Portable Network Graphics: *.png
				// BitMaP: *.bmp, *.rle, *.dib
				// Portable Document Format: *.pdf
				// Moving Picture Experts Group-1/2 Audio Layer 3: mp3
				// Audio Video Interleave: avi
				if(($extension == 'jpg')||($extension == 'jpeg')||($extension == 'jpe'))
					$extension = 'jpeg';
				elseif(($extension == 'bmp')||($extension == 'rle')||($extension == 'dib'))
					$extension = 'bmp';
				// Maintenant on utilise un petit switch sur les extensions connues:
				switch($extension) {
					case 'jpeg':
						echo '<img src="Media/Images/Defaut/jpg_icon.png" alt="JPEG - " class="imgExplorateur" />';
						break;
					case 'gif':
						echo '<img src="Media/Images/Defaut/gif_icon.png" alt="GIF - " class="imgExplorateur" />';
						break;
					case 'png':
						echo '<img src="Media/Images/Defaut/png_icon.png" alt="PNG - " class="imgExplorateur" />';
						break;
					case 'bmp':
						echo '<img src="Media/Images/Defaut/bmp_icon.png" alt="BMP - " class="imgExplorateur" />';
						break;
					case 'pdf':
						echo '<img src="Media/Images/Defaut/pdf_icon.gif" alt="PDF - " class="imgExplorateur" />';
						break;
					case 'mp3':
						break;
					case 'avi':
						break;
					default:
						echo '? - ';
				}
				echo utf8_encode($entree) . '</li>';
			}
		}
	
	}
 
closedir($media);
  
}

?>

Code qui trie par ordre alphabétique



<?php

function explorerDossierAvecTableau($path,$id) {

$tableauMultidimDyn = array();

// On ouvre le dossier envoyer à la fonction
// Et on renvoie une erreur si l'ouverture échoue
$media = opendir($path) or die('<p>Erreur lors de l\'ouverture de: ' . $media . '...</p>');

	// Tant qu'il y a des entrees on traite
	while($entree = readdir($media)) {
		// On élimine les dossiers racine (.) et retour (..)
		if(($entree != '.')&&($entree != '..')) {
			// Si la variable entrée correspond à un dossier
			// On l'affiche, et on ré éxécute la fonction pour ce dossier
			// Sinon on se contente de l'afficher
			if(is_dir($path.'/'.$entree)) {
				// JE BLOQUE ICI
			}
			else {
				// ET ICI
			}
		}
	
	}
 
closedir($media);
echo '<pre>';
print_r($tableauMultidimDyn);
echo '</pre>';
  
}

?>

Code qui trie avec un tableau multidimensionnel...

1 réponse

Messages postés
6648
Date d'inscription
mercredi 13 avril 2011
Statut
Membre
Dernière intervention
28 septembre 2015
1 273
Bonjour,

Je vous conseille de faire une fonction récursive. Principe:

function explorerDossierAvecTableau(tableau) {
    pour chaque ligne du tableau {
        si ligne est un tableau {
            exploreDossierAvectableau(tableau)
        }
       affiche donnée
    }
}


Code:

function getDirectory( $path = '.', $level = 0 ){
    $ignore = array( 'cgi-bin', '.', '..' );
    $dh = @opendir( $path );
    while( false !== ( $file = readdir( $dh ) ) ){
        if( !in_array( $file, $ignore ) ){
            $spaces = str_repeat( '&nbsp;', ( $level * 4 ) );
            if( is_dir( "$path/$file" ) ){
                echo "<strong>$spaces $file</strong><br />";
                // ici la fonction s'appelle elle-même:
                getDirectory( "$path/$file", ($level+1) );
            } else {
                echo "$spaces $file<br />";
            }
        }
    }
    
    closedir( $dh );
    // Close the directory handle

}


Le paramètre level permet de déterminer le niveau hiérarchique d'analyse dans la récursivité.
A+
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 76687 internautes nous ont dit merci ce mois-ci

Merci pour la réponse. J'ajoute également que j'ai trouvé ceci pour ce qui concerne le tri des dossiers d'une manière encore plus simple:

http://cyberzoide.developpez.com/php4/file/