begin process at 2012 02 15 13:07:45
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > TRI PAR TYPE DE FICHIER / EXTENSION

TRI PAR TYPE DE FICHIER / EXTENSION


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :13 808

Auteur : Evangun

Ecrire un message privé
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()

 Sources du même auteur

Source avec Zip Source avec une capture WEBFTP - GÉRER UN SITE EN LIGNE - EXPLORATEUR DE FICHIERS
LISTER LES FICHIERS D'UN DOSSIER ET EN FAIRE DES LIENS ( MEI...
Source avec Zip Source avec une capture QUIZZ PAR CASES RADIOS

 Sources de la même categorie

UPLOADER DES FICHIER DANSUN DOSSIER, SÉCURISÉ AVEC MOT DE PA... par raizzo
COMPTEUR DE VISITES SUR FICHIER par pierreSabatier
FONCTION RECURSIVE DE DOSSIERS par tefa24600
Source avec Zip CONVERSION DES UNITÉS INFORMATIQUE (O, KIO, MIO, GIO, TIO...... par genetApt151
TROUVER LES DOUBLONS DANS UNE LISTE DE FICHIERS par soobook

 Sources en rapport avec celle ci

Source avec Zip RÉCUPÉRER LE TYPE D'UN FICHIER (3 FONCTIONS DIFFÉRENTES) par bad_dark_spirit
PARCOURIR UN RÉPERTOIRE ET SES SOUS SOUS SOUS... RÉPERTOIRE ... par micmonay
CONNAITRE SI LE FICHIER UPLOADER N'EST PAS UN FICHIER PHP par amezghal
TYPE DU FICHER par yannvag
TRI PAR INSERTION par DarkM60

Commentaires et avis

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.

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 +

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

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.

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.

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 +

Commentaire de coucou747 le 11/03/2006 09:02:12 administrateur CS

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.

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

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.

Commentaire de coucou747 le 11/03/2006 16:09:31 administrateur CS

" 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 !

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 ???

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

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.

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.

Commentaire de coucou747 le 11/03/2006 17:51:00 administrateur CS

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...

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.

Commentaire de coucou747 le 11/03/2006 18:29:56 administrateur CS

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

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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,170 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales