convertir un array en utf8
dans un précédent article nous avons vu comment convertir un texte en utf8.
aujourd'hui on va voir comment faire la même chose mais avec un tableau, sans passer par un foreach, ni aucune autre boucle.
pour cela nous allons utiliser une seule fonction qui convertira ce qu'on lui donne en entrée en utf8.
pour l'instant elle va savoir gérer, les chaînes de caractères et les tableaux.
function toUTF8($param) { if(is_array($param)) { array_walk_recursive($param, create_function('&$item, $index', '$item = toUTF8($item);')); return $param; } mb_detect_order('UTF-8, ISO-8859-15, ISO-8859-1, Windows-1252'); //parfois si le dernier caractère de la chaine est accentué, la conversion peut foirer, //donc on force avec un caractère qui ne l'est pas. //(astuce trouvée sur les commentaires de la doc sur php.net) $param .= '_'; $currentCharset = mb_detect_encoding($param); if ($currentCharset != 'UTF-8') { $param = mb_convert_encoding($param, 'UTF-8', $currentCharset); } return substr($param, 0, strlen($param)-1); } |
et voilà, cette fonction convertira array ou string en utf8 sans brancher...
en bonus voici une fonction somme que j'ai trouvé dans les commentaire de la doc sur php.net (une sorte de coup de coeur pour moi :-D)
function sum(){ $s=0; foreach(func_get_args() as $a) $s+= is_numeric($a)?$a:0; return $s; }; print sum(1,2,3,4,5,6); // will return 21 print sum(3,2,1); // will return 6 print sum(false,array(),5,5); // will return 10 |
trop fort non ?
Trier un tableau multidimensionnel
1. Le problème :
Nous avons un répertoire contenant plusieurs fichiers, nous voulons les afficher en faisant un tri sur la taille, la date de création etc.
2. Marche à suivre :
- récupérer les fichiers du répertoire.
- les mettre dans un tableau multidimensionnel.
- trier notre tableau.
En décomposant la tache en plusieurs parties, on s'aperçoit que ce n'est pas si compliqué que ça, et pourtant ça semblait difficile :)
allez, on se lance :
1./2. lecture des fichiers, mise en tableau :
$rep = "NOTRE/REPERTOIRE/"; $dir = opendir($rep); while ($f = readdir($dir)){ if(is_file($rep.$f)){ $sizeMo = filesize($rep.$f) / 1024 / 1024; //la taille du fichier en Mo $liste1[] = "$f"; //le nom du fichier $liste1[] = number_format($sizeMo, 2, ",", " "); //la taille en format 7,66 $liste1[] = df(filectime($rep.$f)); //la date de création au format FR (voir df() plus bas) $liste1[] = filectime($rep.$f);//la date de création au format timestamp (nous servira pour le tri) $liste[] = $liste1; //on met notre tableau liste1 dans un autre tableau (le gros multidimensionnel) } } function df($date) {//pour convertir une date au format FR return date("d/m/Y H:i:s",$date); } |
après cette opération le résultat pourrait ressembler à ça :
fichier1 10 01/05/2007 0123654747899 (exemple du timestamp) fichier2 20 01/05/2007 0123654747899 fichier3 15 11/14/2006 0123654747899 fichier7 10 21/08/2007 0123654747899 fichier6 150 01/05/2005 0123654747899 etc.
3. tri de notre tableau :
foreach ($liste as $key =>$row) { $nom[$key] = $row[0];//c'est la colonne des nom de fichiers$taille[$key] = $row[1];//des tailles $date1[$key] = $row[2];//des dates fr $date2[$key] = $row[3];//des dates } array_multisort($date2, SORT_DESC, $nom, SORT_ASC, $liste);//la fonction de tri |
et voilà, notre tableau est trié par date de création dans notre cas, on peut maintenant le parcourir et l'afficher comme on veut.
bons tests :)
Pour en discuter : http://forum.naeh.net/index.php?topic=33.0