Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TRI PAR TYPE DE FICHIER / EXTENSION


Information sur la source

Catégorie :Fichier / Disque Classé sous : tri, type, fichier, extension, trier Niveau : Débutant Date de création : 09/03/2006 Date de mise à jour : 10/03/2006 15:52:17 Vu : 10 623

Note :
7,6 / 10 - par 5 personnes
7,60 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

Description

Fonction pour trier des noms de fichiers par type (et alphabétiquement au sein d'un type).

Concrètement,

array('3.jpg', '1.bmp', '7.dot', '5.dot')

devient

array('1.bmp', '5.dot', '7.dot', '3.jpg')
 

Source

  • <?php
  • function cmp($ar1, $ar2){
  • $ar1 = array(strtoupper(str_replace(strrchr($ar1, '.'), '', $ar1)), strtoupper(strrchr($ar1, '.'))); //on scinde le nom de fichier et l'extension
  • $ar2 = array(strtoupper(str_replace(strrchr($ar2, '.'), '', $ar2)), strtoupper(strrchr($ar2, '.')));
  • if($ar1[1] > $ar2[1]){
  • return 1;
  • }
  • elseif($ar1[1] === $ar2[1]){
  • strcmp($ar1[0], $ar2[0]);
  • }
  • else {
  • return -1;
  • }
  • }
  • function tri($array){
  • usort($array, 'cmp');
  • return $array;
  • }
  • //exemple d'utilisation :
  • $fichier = array('3.jpg', '1.bmp', '7.dot', '5.dot');
  • $fichier = tri($fichier);
  • print_r($fichier);
  • ?>
<?php

function cmp($ar1, $ar2){

	$ar1 = array(strtoupper(str_replace(strrchr($ar1, '.'), '', $ar1)), strtoupper(strrchr($ar1, '.')));	//on scinde le nom de fichier et l'extension
	$ar2 = array(strtoupper(str_replace(strrchr($ar2, '.'), '', $ar2)), strtoupper(strrchr($ar2, '.')));

	if($ar1[1] > $ar2[1]){
		return 1;
	}
	elseif($ar1[1] === $ar2[1]){
		strcmp($ar1[0], $ar2[0]);
	}
	else {
		return -1;
	}
}

function tri($array){

	usort($array, 'cmp');
	return $array;
}




//exemple d'utilisation :

$fichier = array('3.jpg', '1.bmp', '7.dot', '5.dot');
$fichier = tri($fichier);
print_r($fichier);

?>

Conclusion

C'est tout bête mais je n'ai pas trouvé ce code sur le site quand je l'ai cherché, alors...
 

Historique

10 mars 2006 14:52:25 :
0
10 mars 2006 15:43:03 :
Benchmark : avec l'utilisation de strcmp() là où c'était possible, on passe environ de 0.0072 à 0.0068 sur 2000 itérations
10 mars 2006 15:52:18 :
déplacement des strtoupper()

Commentaires et avis

signaler à un administrateur
Commentaire de aze555666 le 09/03/2006 22:32:47

pas mal, utile.
Il faudra que je l'integre à mon petit webftp (source 24147 si je ne me trompe pas).
je met 7 pour l'idée.

signaler à un administrateur
Commentaire de Anthomicro le 09/03/2006 23:24:48

Salut,

un petit glob pour récupérer les fichiers dans un tableau, ensuite un array_multisort ou encore un sort, etc... pour trier, et hop c'est torché ;-) Après y'a différences possibilités de tri, mais ça sera à mon avis plus rapide que tout ça.

a +

signaler à un administrateur
Commentaire de malalam le 09/03/2006 23:35:11 administrateur CS

Hello,

pas mal, et original.
Quelques bémols : comparaisons strictes de rigueur, ici.
Et puis tu pourrais faire l'économie de quelques strtoupper.
Sinon, pourquou un create_function...? Tu aurais pu te l'épargner et faire directement appel à un callback. Et tu aurais peut-être mieux faire d'utiliser strcmp(), dans cmp (), mais c'est à tester question rapidité.
Mais bon, c'est quand même pas mal :-)

signaler à un administrateur
Commentaire de Evangun le 10/03/2006 15:04:43

Salut,
Malalam : merci beaucoup pour tes commentaires, j'ai changé le == par === et le cmp (probablement plus rapide en effet) et enlevé le create_function.
Pour ce qui est des strtoupper, c'est pour avoir un tri insensible à la casse.

Anthomicro : je serais curieux de voir comment tu utilises le array_multisort() et encore plus le sort() pour avoir le même résultat, je ne pense pas que ce soit directement possible. C'est sûr que c'est frustrant quand on pense que MySql le fait en 1 ligne :^)
Sinon, aze: je connais ta source pour l'avoir modifiée à ma façon et j'y ai déjà intégré cette fonction de tri. Je publierai ça aujourd'hui ou demain d'ailleurs.

signaler à un administrateur
Commentaire de malalam le 10/03/2006 15:23:42 administrateur CS

strtoupper => je sais, j'avais compris. Il n'empêche que tu le fais plusieurs fois, sur les mêmes variables. Tu pourrais ne le faire qu'une fois.

Je pense aussi qu'avec array_multisort c'est faisable, et que ce serait plus rapide, ceci dit.

signaler à un administrateur
Commentaire de Anthomicro le 10/03/2006 21:24:31

Voilà ce que ça donne en légèrement plus rapide (j'ai benché les deux codes à titre de comparaison). Pour rendre le tien équitable j'ai remplacé le print_r() par une fonction afficher qui fait un foreach() (comme pour mon code).

<?php
$tableau_final=array();
$tableau_fichiers=glob('*.*'); //Récupère tous les fichiers du dossier en cours

//----------------------------------------------
//DESASSEMBLE LES NOMS DE FICHIERS ET EXTENSIONS
//----------------------------------------------
function mettre_extension($array)
{
list($nom_fichier,$extension)=explode('.',$array);
$GLOBALS['tableau_final'][$extension][]=$nom_fichier.'.'.$extension;
return TRUE;
}
//----------------------------------------------
//AFFICHE TOUT
//----------------------------------------------
function afficher($valeur)
{
foreach($valeur AS $nom_fic)
{
echo $nom_fic,'<br />';
}
}

array_map('mettre_extension',$tableau_fichiers);

array_multisort($tableau_final,SORT_ASC);

$tableau_final=array_values($tableau_final);
array_map('afficher',$tableau_final);
?>

Et encore le array_map c'est pour gagner des lignes de code, y'a encore moyen d'optimiser.

a +

signaler à un administrateur
Commentaire de coucou747 le 11/03/2006 09:02:12

perso, je préfère la source d'antho, mais bon, l'autre n'est pas mal codée, et n'est pas horrible... Antho, c'est une source débutant, et on ne voit pas de <?, ni de ", pour moi, c'est un bon point ;)

je vais noter 7, j'aurais noté plus si ça avait été un projet et non une fonction.

signaler à un administrateur
Commentaire de Anthomicro le 11/03/2006 09:08:03

Je n'ai pas noté cette source, c'était juste pour lui prouver que je pouvais le faire avec quelques fonctions basées sur les arrays vu qu'il me croyait pas (lol).

signaler à un administrateur
Commentaire de Evangun le 11/03/2006 15:56:20

Hello,
Je vois que ça a l'air possible comme ça effectivement !
Mais un ou deux détails me chiffonnent :
1) chez moi ta fonction affiche dans l'ordre: les gifs, jpg, txt, php. je ne vois pas d'où ça vient, ma fonction les mets dans le bon ordre.
2) pour le benchmark, si on veut vraiment mettre nos fonctions à égalité, il faut que la tienne gère aussi les fichiers dont le nom contient plusieurs points, et insensiblement à la casse.

signaler à un administrateur
Commentaire de coucou747 le 11/03/2006 16:09:31

" gifs, jpg, txt, php. "<= c'est le rendu d'antho...
"array('1.bmp', '5.dot', '7.dot', '3.jpg') "<= c'est ton rendu...

personellement, je préfère grouper les images... donc, celle d'antho convient mieux

La sensibilité à la casse existe sous les systèmes unix et dérivés (macos, linux, bsd) pour les noms de fichiers !

signaler à un administrateur
Commentaire de Evangun le 11/03/2006 16:23:23

Oui mais pour un humain qui veut lister son répertoire, il préfère voir fichier1.txt avant Fichier2.txt :)
Pour ce qui est de l'ordre : si on commence à ne plus ranger alphabétiquement les extensions, avec des dizaines de fichiers et de types, on n'est pas sortis de l'auberge ! Et cette façon de ranger, elle est due à array_multisort ???

signaler à un administrateur
Commentaire de Anthomicro le 11/03/2006 16:34:34

"2) pour le benchmark, si on veut vraiment mettre nos fonctions à égalité, il faut que la tienne gère aussi les fichiers dont le nom contient plusieurs points, et insensiblement à la casse."

Pour la casse c'est déjà fait, pour les fichiers qui comportent des points je pourrais récupérer l'extension d'une autre manière effectivement. Je testerai pour voir ce que ça change au temps de rendu final, mais bon sans m'avancer je pense pas que ça va ralentir trop mon script :-)

signaler à un administrateur
Commentaire de Anthomicro le 11/03/2006 16:36:00

Pour le glob c'était juste pour avoir un tableau à disposition, j'aurais pu créer un array... j'ai mis aussi le glob pour tester ton code.

signaler à un administrateur
Commentaire de Evangun le 11/03/2006 16:57:02

OK :)
Pour conclure la petite histoire, même si l'ordre des extensions n'est pas alphabétique dans ton script, au final tu fais en moyenne du 0.017 contre 0.022 pour mon script.

signaler à un administrateur
Commentaire de coucou747 le 11/03/2006 17:51:00

vous comparez des choses sans même voir les fonctions en C...

si ça se trouve, antho est meilleur sur un petit tableau et Evangun sur un grand, ou antho sur un tableau rangé de façon aléatoire, et Evangun sur un tableau quasiment trié [...]
Bref, faudrait regarder leur algorithme de tri pour pouvoir dire exactement lequel est le meilleur, et dans quel cas il l'est...

signaler à un administrateur
Commentaire de Anthomicro le 11/03/2006 18:23:02

Bof j'ai testé sur un petit tableau, je pense pas que ça change grand chose si le tableau est grand, au contraire même.

signaler à un administrateur
Commentaire de coucou747 le 11/03/2006 18:29:56

Anthomicro, ça dépend de ton algo...

signaler à un administrateur
Commentaire de Anthomicro le 11/03/2006 21:57:16

je te parle de nos fonctions respectives, ça changera rien que le tableau soit petit ou grand, mais si tu veux on peut essayer :-)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Header Content type [ par xactise ] Bonjours je voudrai savoir si toute les extension de fichier on un content-type ? parce que j'aimerai proposer en upload sur mon site des fichier a l' bug sur move_uploaded_file()... (gros fichiers) [ par Waynejunior ] Bonjour, j'ai apparemment un bug sur un script de move_uploaded_file()... sur de gros fichiers, mon script (voir en dessous) ne marche pas. Il ne fait pb formulaire d'upload [ par biddal ] Voici mon code $cpp=""; if( isset($_POST['upload']) ) // si formulaire soumis {  $content_dir = 'photo/'; // dossier où sera déplacé le fichier   $t Problème upload de fichier [ par Tupac59 ] Bonjour, ce script me permet &#224; un membre d'uploader des fotos dans son dossier. Le probl&#232;me est que lorsque que j'upload une foto, celle-ci extension fichier [ par kenny18 ] Salut,J'ai une question très con !Dans un formualire, j'ai 2 champs type file :$i=1;echo "&lt;input type=\"file\" name=\"$i\"&gt;&lt;br&gt;";$i++;echo decouper une url pour ne garder que l'extension du fichier [ par loupile ] Bonjour , alors voila jusqu'a present pour obtenir cette extension je faisais  $last=strrchr($url,"."); oui mais voila quand l'url est de type : http: Erreur de fichier joint-mail [ par GillesWebmaster ] Bonjour ,j'utilises ce script mais il m'envoie un fichier qui p&#232;se 87o il est donc vide et/ou illisiblele voici:$boundary = "-----=".md5(uniqid(r Tri multicritère [ par Evangun ] Bonsoir &#224; tous,je gal&#232;re un peu pour r&#233;ussir &#224; trier des fichiers par ordre alphab&#233;tique et par type de fichier en m&#234;me problème d'upload [ par romiain ] Salut à tous, J'ai un problème avec mon upload, lorsque je charge une photo j'ai l'erreur suivante Notice: Undefined variable: name_file in c:\program Move_uploaded_file probleme avec le nom du fichier uploader [ par needle ] Salut &#224; tous,j'avais fait un page d'upload de photos qui marchait nickel et j'avais pris la pr&#233;caution de n'autoriser, pour le nouveau nom d


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,515 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.