Scandir ordre décroissant

Eléphanteau du PHP | 22 Messages

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!

Eléphant du PHP | 422 Messages

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

++
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

ViPHP
ViPHP | 2577 Messages

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

Eléphanteau du PHP | 22 Messages

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.

Eléphanteau du PHP | 22 Messages

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!
Modifié en dernier par yeste64 le 13 avr. 2011, 11:12, modifié 1 fois.

Eléphanteau du PHP | 22 Messages

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 =)

ViPHP
xTG
ViPHP | 7331 Messages

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()... :/

Eléphanteau du PHP | 22 Messages

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 ?