[PhP] Tableau multidimmentionnel dynamique...

Résolu/Fermé
InFactITry - Modifié par InFactITry le 16/06/2011 à 19:42
 InFactITry - 17 juin 2011 à 12:26
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...
A voir également:

1 réponse

mpmp93 Messages postés 6652 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
17 juin 2011 à 09:10
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 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/
0