TRI PAR TYPE DE FICHIER / EXTENSION

aze555666 Messages postés 208 Date d'inscription mardi 13 avril 2004 Statut Membre Dernière intervention 26 janvier 2009 - 9 mars 2006 à 22:32
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 - 11 mars 2006 à 21:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36465-tri-par-type-de-fichier-extension

cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
11 mars 2006 à 21:57
je te parle de nos fonctions respectives, ça changera rien que le tableau soit petit ou grand, mais si tu veux on peut essayer :-)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
11 mars 2006 à 18:29
Anthomicro, ça dépend de ton algo...
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
11 mars 2006 à 18:23
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.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
11 mars 2006 à 17:51
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...
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
11 mars 2006 à 16:57
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.
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
11 mars 2006 à 16:36
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.
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
11 mars 2006 à 16: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 :-)
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
11 mars 2006 à 16: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 ???
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
11 mars 2006 à 16:09
" 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 !
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
11 mars 2006 à 15:56
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.
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
11 mars 2006 à 09:08
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).
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
11 mars 2006 à 09:02
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.
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
10 mars 2006 à 21:24
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,'
';
}
}

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 +
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
10 mars 2006 à 15:23
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.
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
10 mars 2006 à 15:04
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.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 mars 2006 à 23:35
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 :-)
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
9 mars 2006 à 23:24
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 +
aze555666 Messages postés 208 Date d'inscription mardi 13 avril 2004 Statut Membre Dernière intervention 26 janvier 2009
9 mars 2006 à 22:32
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.