Scandir ordre décroissant

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Scandir ordre décroissant

Re: Scandir ordre décroissant

par yeste64 » 14 avr. 2011, 14:34

Ce qui serait plus propre aussi c'est d'utiliser une boucle foreach() plutôt que d'associer une condition isSet dans une boucle for()... :/
$i=0;
foreach ($contenu as $nomDossier)
{
	$decoupe = explode("request", $nomDossier);
	$num[$i] = $decoupe[2];
	$i++;
}
Comme ça ?

Re: Scandir ordre décroissant

par xTG » 13 avr. 2011, 12:49

Ce qui serait plus propre aussi c'est d'utiliser une boucle foreach() plutôt que d'associer une condition isSet dans une boucle for()... :/

Re: Scandir ordre décroissant

par yeste64 » 13 avr. 2011, 11:06

J'ai trouvé une solution intermédiaire, consistant à ne lister QUE les dossiers commençant par "request" (ce qui m'intéresse ici), à l'aide de la fonction glob. Cette solution me plaît beaucoup plus, voici son code :
//--------------------------------------
// Création de l'arborescence temporaire
//--------------------------------------

$contenu = glob("neomapper/requests/request*"); //Liste des dossiers du répertoire commençant par "request"
//On récupère les numéros de tous les dossiers
for ($i=0; isset($contenu[$i]); $i++)
{
	$decoupe = explode("request", $contenu[$i]);
	$num[$i] = $decoupe[2];
}
if (isset($decoupe[2])) //Si ce n'est pas le premier dossier
{
	rsort($num); //On trie les numéros par ordre décroissant
	$suffixe = $num[0] + 1; //On rajoute 1 au plus grand numéro
}
else
{
	$suffixe = 1;
}
$chemin = "neomapper/requests/request" . $suffixe; //Chemin du dossier à créer
Et voilà! Merci à tous de votre aide, à bientôt =)

Re: Scandir ordre décroissant

par yeste64 » 13 avr. 2011, 10:47

C'est bon, j'ai résolu le problème.
En fait j'ai listé les dossiers du répertoire comme avant.Puis j'ai stocké le numéro du nom de chaque dossier dans un tableau. J'ai ensuite trié ces numéros par ordre décroissant pour récupérer le plus grand numéro en tête de liste. Et enfin je rajoute 1 à ce numéro, pour finalement le concaténer à la fin du nom de dossier (ici "request"). Et voilà, c'est niquel =)
	
//--------------------------------------
// Création de l'arborescence temporaire
//--------------------------------------

$contenu = scandir("neomapper/requests"); //Liste des dossiers du répertoire

//On récupère les numéros de tous les dossiers
for ($i=0; isset($contenu[$i]); $i++)
{
	$decoupe = explode("request", $contenu[$i]);
	if ($decoupe[0] != '.' && $decoupe[0] != '..')
	{
		$num[$i] = $decoupe[1];
	}
}

if (isset($decoupe[1])) //Si ce n'est pas le premier dossier
{
	rsort($num); //On trie les numéros par ordre décroissant
	$suffixe = $num[0] + 1; //On rajoute 1 au plus grand numéro
}
else
{
	$suffixe = 1;
}

$chemin = "neomapper/requests/request" . $suffixe; //Chemin du dossier à créer
J'aurais une autre question : Y'aurait-il un moyen de lister tout le contenu du répertoire en excluant les dossiers "." et ".." ? Car ma condition à chaque tour de boucle pour vérifier cela ne me plaît pas du tout. Merci d'avance à vous!

Re: Scandir ordre décroissant

par yeste64 » 13 avr. 2011, 10:02

Même en les nommant request001, j'obtiens le même résultat. En fait, ça passe à request0010 au lieu de request010.. Je ne comprends pas trop la démarche à suivre pour remédier au problème...

Merci beaucoup de votre aide.

Re: Scandir ordre décroissant

par Mazarini » 13 avr. 2011, 09:08

Bonjour,

La lecture se fait bien dans le bon ordre alphabétique avec request2, request10, request1.
Pour faire ce que tu veux, il faudrait nommer tes fichiers request01... ou request001.. suivant le nombre max que tu penses gérer. Il est important de connaitre ce nombre max, car le nombre de fichiers d'un répertoire n'est pas infini et tu pourrais rencontrer des problèmes.

En cas de problèmes de nombre de fichiers max, il faut gérer des répertoires pour éclater les fichiers. Une solution est de créer des répertoires 00 à 99 et de mettre des fichiers ou des répertoires 00 à 99 à l'intérieur. Le numéro du fichier est alors la concaténation du numéro du fichier et des numéros des répertoires parents.

Une solution alternative serait de gérer le numéro de fichier dans une table de base de donnée. Une table avec un id en auto incrément. Tu fait un insert avec la valeur nulle, tu récupères le mysql_insert_id() et tu supprimes les id inférieurs. Comme ca pas de risque de collision entre 2 demandes simultanées

Re: Scandir ordre décroissant

par telnes » 12 avr. 2011, 19:57

hello

et en passant par sort http://fr.php.net/manual/fr/function.sort.php sur le résultat de scandir

++

Scandir ordre décroissant

par yeste64 » 12 avr. 2011, 18:11

Bonjour à tous,
J'ai un problème avec l'utilisation de scandir. En effet, je liste le contenu de mon répertoire par ordre décroissant, pour pouvoir ensuite incrémenter le nom du dernier dossier et ainsi pouvoir en créer un nouveau avec un nom qui le suit. Je vous mets le bout de code correspondant à ce que je dis :
			//--------------------------------------
			// Création de l'arborescence temporaire
			//--------------------------------------
			
			$contenu = scandir("neomapper/requests", 1); //Liste des dossier du répertoire par ordre décroissant
			$decoupe = explode("request", $contenu[0]); //Numéro du dernier dossier
			if (isset($decoupe[1])) //Si ce n'est pas le premier, on lui rajoute 1
			{
				$suffixe = $decoupe[1] + 1;
			}
			else
			{
				$suffixe = 1;
			}
			$chemin = "neomapper/requests/request" . $suffixe; //Chemin du dossier à créer
			if(!file_exists($chemin))
			{
				mkdir($chemin);
				if(file_exists($chemin))
				{
					mkdir($chemin ."/data_ext");
					mkdir($chemin ."/kmlmodelfiles");
					mkdir($chemin ."/kmz");
					mkdir($chemin ."/log");
Cependant, scanlist liste mal les dossiers dès qu'ils arrivent à 10. Voici comment il fait :

Code : Tout sélectionner

request9 request8 request7 request6 request5 request4 request3 request2 request10 request1 .. .
Ainsi, je ne peux plus continuer au-delà de 10 car pour lui le dernier reste "request9" et j'essaie donc de créer "request10" qui existe déjà du coup...
J'espère m'être fait comprendre.
Merci d'avance de votre aide!