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 ?

Share

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

Share