Page 1 sur 1

liste dossier + sous-dossier par date du dernier fichier ajouté.

Posté : 19 juil. 2015, 00:35
par westernz
Bonjour.

Je tente de construire un code ... Sans succès

Je veux une liste exploitable pour un foreach qui listerai mes dossiers et sous-dossier, le tout trié par ordre du dernier fichier ajouté.

Vous pensez quoi de ça ?
Y-a-t-il plus simple ?

Sachant que c'est pas encore au point.
Le var_dump me renvoi pas grand chose :(

Code : Tout sélectionner

while ($rep = readdir($dir)) { if($rep != '..' && $rep !='.' && $rep !='' && is_dir($loc.'/'.$rep) ) { $sub_dir = opendir('./'.$loc.'/'.$rep); while ($sub_rep = readdir($sub_dir)) { if($sub_rep != '..' && $sub_rep !='.' && $sub_rep !='' && is_dir($loc.'/'.$rep) ) { $sub_doc_list = array(); $last_up_time = ''; $sub_loc = './'.$loc.'/'.$rep.'/'.$sub_rep; $sub_dir = opendir($sub_loc); while ($file = readdir($sub_dir)) { if($file != '..' && $file !='.' && $file !='') { $file_up_time = filemtime('./'.$loc.'/'.$rep.'/'.$sub_rep.'/'.$file); if ($last_up_time == '' || $last_up_time < $file_up_time) {$last_up_time = $file_up_time;} // La clé de l'array est la date du dernier fichier uploadé $sub_doc_list[$last_up_time] = $sub_rep; } } } } krsort($sub_doc_list); // On invers l'array pour récup la date du sous-dossier. $flip= array_flip($sub_doc_list); // On construit la liste des dossiers et des sous dossier dans un array pour le foreach $doc_list[$flip[0]] = array($rep => $sub_doc_list); } } krsort($doc_list); closedir($dir);
Bonne journée

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

Posté : 19 juil. 2015, 01:36
par tof73
le second
if($rep != '..' && $rep !='.' && $rep !='' && is_dir($loc.'/'.$rep) )
ne devrait pas tester $rep mais $sub_rep

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

Posté : 19 juil. 2015, 11:37
par westernz
Effectivement. Merci
Plus on connais son code et moins on en voit les détails erronés :(

N’empêche que ça n'est toujours pas bon.
Je continu à chercher.

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

Posté : 19 juil. 2015, 15:56
par westernz
voilà ma première partie qui ne bug pas.

Mais je ne sais pas comme faire un krsort sur un array quand il est déjà dans un array :(

Code : Tout sélectionner

// Liste des dossier triés par date de dernier ajout. $doc_list = array(); $loc = "photos"; // dossier général de stockage photo $dir = opendir($loc); // LECTURE DOSSIERS while ($rep = readdir($dir)) { if($rep != '..' && $rep !='.' && $rep !='' && is_dir($loc.'/'.$rep) && $rep !='infos.php' && $rep != '#template' && $rep != 'filigrane' ) { $sub_dir = opendir('./'.$loc.'/'.$rep); // CREATION DE L'ARRAY POUR CE DOSSIER $doc_list[$rep] = array(); // LECTURE SOUS-DOSSIERS while ($sub_rep = readdir($sub_dir)) { if ($sub_rep != '..' && $sub_rep !='.' && $sub_rep !='' && is_dir($loc.'/'.$rep) && $sub_rep !='infos.php' && $sub_rep != '#template' && $sub_rep != 'filigrane' ) { $sub_doc_list = array(); $last_up_time = ''; $sub_loc = './'.$loc.'/'.$rep.'/'.$sub_rep; $file_dir = opendir($sub_loc); // LECTURE FICHIERS while ($file = readdir($file_dir)) { if($file != '..' && $file !='.' && $file !='' && $file !='infos.php' && $file != '#template' && $file != 'filigrane') { // TROUVER LE FICHIER LE PLUS RECENT $file_up_time = filemtime('./'.$loc.'/'.$rep.'/'.$sub_rep.'/'.$file); if ($last_up_time == '' || $last_up_time < $file_up_time) {$last_up_time = $file_up_time;} } } // INCLURE LE SOUS-DOSSIER DANS LA LISTE DANS LE DOSSIER $doc_list[$rep][$last_up_time] = $sub_rep; } } } } closedir($dir); closedir($sub_dir); closedir($file_dir); var_dump($doc_list); ?>

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

Posté : 19 juil. 2015, 20:42
par westernz
Je n'arrive pas a exploiter mon dernier code ci-dessus, pourtant il me semble bon quand je le test.
Je suis nul sur les array :(

$doc = array >> key = nom du dossier
value = array >> key = date du sous dossier
value = nom du sous dossier

Je veux liste les dossiers et sous dossier par date.
Je n'en peux plus de ne pas y arriver :(

Bonne journée

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

Posté : 20 juil. 2015, 17:06
par westernz
J'arrive à trier les sous-dossier. C'est assez simple.
Mais pas les dossiers. Et là je sèche.

Code : Tout sélectionner

foreach($doc_list as $KEY => $doc) { krsort($doc); print_r($doc); }

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

Posté : 24 juil. 2015, 13:38
par westernz
Pour le moment ca marche sur 2 niveaux.
Je vous donne mes deux fonctions et un exemple d'utilisation.
Je pense n'avoir rien oublié.

// TRI DES DOSSIER ET SOUS DOSSIERS POURS LES MENUS

Code : Tout sélectionner

function list_dossier($loc) { $doc_list = array(); $doc_list_chrono = array(); $dir = opendir($loc); // LECTURE DOSSIERS while ($rep = readdir($dir)) { if($rep != '..' && $rep !='.' && $rep !='' && is_dir($loc.'/'.$rep) && $rep !='infos.php' && $rep != '#template' && $rep != 'filigrane' ) { $sub_dir = opendir('./'.$loc.'/'.$rep); // CREATION DE L'ARRAY POUR CE DOSSIER $doc_list[$rep] = array(); // LISTE DES DOSSIER $docs_names[$i] = $rep; $i++; // LECTURE SOUS-DOSSIERS while ($sub_rep = readdir($sub_dir)) { if ($sub_rep != '..' && $sub_rep !='.' && $sub_rep !='' && is_dir($loc.'/'.$rep) && $sub_rep !='infos.php' && $sub_rep != '#template' && $sub_rep != 'filigrane' ) { $sub_doc_list = array(); $last_up_time = ''; $sub_loc = './'.$loc.'/'.$rep.'/'.$sub_rep; $file_dir = opendir($sub_loc); // LECTURE FICHIERS while ($file = readdir($file_dir)) { if($file != '..' && $file !='.' && $file !='' && $file !='infos.php' && $file != '#template' && $file != 'filigrane') { // TROUVER LE FICHIER LE PLUS RECENT $file_up_time = filemtime('./'.$loc.'/'.$rep.'/'.$sub_rep.'/'.$file); if ($last_up_time == '' || $last_up_time < $file_up_time) {$last_up_time = $file_up_time;} } } // INCLURE LE SOUS-DOSSIER DANS LA LISTE DANS LE DOSSIER $doc_list[$rep][$last_up_time] = $sub_rep; } } } } closedir($dir); closedir($sub_dir); closedir($file_dir); return $doc_list; } function tri_dossier($doc_list) { // TRI DES DOSSIER ET SOUS-DOSSIERS PAR ORDRE CHRONOLOGIQUE $doc_list_chrono = array(); foreach($doc_list as $doc => $sub_doc_list) { // SOUS-DOSSIERS krsort($sub_doc_list); foreach($sub_doc_list as $date => $sub_doc) { if ($doc_list_chrono[$doc] == false || $doc_list_chrono[$doc] == '' || $doc_list_chrono[$doc] < $date) {$doc_list_chrono[$doc] = $date;} } } $doc_list_chrono = array_flip($doc_list_chrono); krsort($doc_list_chrono); return $doc_list_chrono; }
Avec un menu (ce n'est pas moi qui l'est fait) qui se construit tout seul sur 2 niveaux.
Attention, je met les titres dans un fichier infos.php dans chaque dossier et sous dossier, ceci afin d'avoir des noms de dossier sans accent et des titre avec accent.

Code : Tout sélectionner

<!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <META content="CSS, cascading style sheets, mise en page, design, site, web, techniques, sites, webmaster, page" name=keywords> <STYLE type=text/css>#monmenu { FONT-WEIGHT: bold; FONT-SIZE: 100%; FONT-FAMILY: trebuchet ms,arial,tahoma,verdana,sans-serif } #monmenu UL UL { BORDER-RIGHT: #b0b0b0 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #b0b0b0 1px solid; DISPLAY: none; PADDING-LEFT: 0px; LEFT: 264px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: #b0b0b0 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #b0b0b0 1px solid; POSITION: absolute; TOP: -1px } #monmenu LI { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; MARGIN: 0px; WIDTH: 260px; HEIGHT:24px; PADDING-TOP: 2px; LIST-STYLE-TYPE: none; POSITION: relative; BACKGROUND-COLOR: #000000 } #monmenu LI:hover { BACKGROUND-COLOR: #555555 } #monmenu LI.sfhover { BACKGROUND-COLOR: #555555 } #monmenu LI A { TEXT-DECORATION: none } #monmenu LI:hover UL.niveau2 { DISPLAY: block } #monmenu LI LI:hover UL.niveau3 { DISPLAY: block } #monmenu LI.sfhover UL.niveau2 { DISPLAY: block } #monmenu LI LI.sfhover UL.niveau3 { DISPLAY: block } #monmenu LI.plus { BACKGROUND-POSITION: right 50%; BORDER-BOTTOM: #b0b0b0 0px solid; BACKGROUND-REPEAT: no-repeat } </STYLE> <!--[if lt IE 7]> <SCRIPT type=text/javascript> // Fonction destinée à remplacer le "LI:hover" pour IE 6 sfHover = function() { var sfEls = document.getElementById("monmenu").getElementsByTagName("li"); for (var i=0; i<sfEls.length; i++) { sfEls[i].onmouseover = function() { this.className = this.className.replace(new RegExp(" sfhover"), ""); this.className += " sfhover"; } sfEls[i].onmouseout = function() { this.className = this.className.replace(new RegExp(" sfhover"), ""); } } } if (window.attachEvent) window.attachEvent("onload", sfHover); </SCRIPT> <STYLE type=text/css>#monmenu LI { WIDTH: 264px } </STYLE> <![endif]--> <DIV id="monmenu"> <UL class=niveau1> <LI> <table width="260" border="1" cellpadding="0" cellspacing="0"><tr><td align="center">MES RECHERCHES</td></tr></table> <UL class=niveau2 style="LEFT: 0px; TOP: 22px"> <?php // Menu automatique en fonction du contenu du dossier /photos/ function list_menu($type) { if ($type == 'listing') { $loc = "photos"; // dossier général de stockage photo $dir = opendir($loc); } elseif ($type == 'page') { $loc = "pages"; // dossier général de stockage texte $dir = opendir($loc); } else { $loc = "photos"; // dossier général de stockage photo $dir = opendir($loc); } // TRI DES DOSSIERS $doc_list = list_dossier($loc); $doc_list_chrono = tri_dossier($doc_list); // AFFICHAGE DES DOSSIERS ET SOUS-DOSSIERS PAR DATE : LE DERNIER FICHIER AJOUTE / LE PLUS RECENT EN PREMIER foreach($doc_list_chrono as $date => $doc) { // DOSSIER if (file_exists($loc.'/'.$doc.'/infos.php')) {include $loc.'/'.$doc.'/infos.php';} // récupération des infos du dossier else {$titre = 'untitled';} echo '<LI class=plus>'; echo $titre; echo'&nbsp;>'; echo '<UL class=niveau3>'; // SOUS DOSSIER foreach($doc_list as $main_doc => $sub_doc_list) { if ($main_doc == $doc) { foreach($sub_doc_list as $date => $sub_doc) { if (file_exists($loc.'/'.$doc.'/'.$sub_doc.'/infos.php')) // infos dossier {include $loc.'/'.$doc.'/'.$sub_doc.'/infos.php';} else {$titre = 'untitled';} echo '<A href="?type='.$type.'&pass='.$get_pass.'&code='.$get_code.'&loc='.$loc.'/'.$doc.'/'.$sub_doc.'"><LI>'; echo $titre; echo '</LI></A>'; } } } echo '</UL></LI>'; } } list_menu('listing'); list_menu('page'); ?> </UL> </LI></UL> </DIV> <![endif]-->

Re: [RESOLU] liste dossier + sous-dossier par date du dernier fichier ajouté.

Posté : 27 juil. 2015, 18:23
par westernz
Petite correction :
// INCLURE LE SOUS-DOSSIER DANS LA LISTE DANS LE DOSSIER
$doc_list[$rep][$last_up_time] = $sub_rep;
krsort($doc_list[$rep]); // J'AVAIS OUBLIE LE TRI DES SOUS DOSSIERS