Optimisation du tri d'un tableau a 2 dimensions
Posté : 18 mai 2010, 18:51
Bonjour,
J'ai besoin d'un petit coup de main, donc si vos neurones ne sont pas HS, je recherche une solution si elle existe, pour optimiser mon traitement actuel d'un tri sur un tableau à 2 dimensions.
Pour expliquer un peu mon code ci dessous :
- J'ai une série de fichiers texte contenant des données, dont une appelée "ordre", c'est celle-ci qui nous intéresse
- Je fait une première boucle pour rassembler tout le contenu de mes fichiers dans un tableau. Les clés du tableau sont les ID, les valeurs sont donc des tableaux contenant les données
- Ayant besoin de trier le tableau par rapport à la valeur "ordre" j'applique ma fonction de tri
- Mais la fonction de tri ne conservant pas mes clés, je suis obligé de les reconstituer avec une seconde fonction
Au final il m'aura donc fallu faire 3 foreach pour construire mon tableau, ce qui me semble beaucoup, mais je n'ai pas réussi a trouver d'autre solutions pour réduire les traitements.
Si vous avez quelques minutes à faire perdre a vos neurones,
Voici le code :
Array
(
[1] => Array
(
[id] => 1
[nom] => page
[ordre] => 2
[homepage] => 0
[contenu] =>
)
[2] => Array
(
[id] => 2
[nom] => page bis
[ordre] => 1
[homepage] => 1
[contenu] =>
)
)
Array
(
[2] => Array
(
[id] => 2
[nom] => page bis
[ordre] => 1
[homepage] => 1
[contenu] =>
)
[1] => Array
(
[id] => 1
[nom] => page
[ordre] => 2
[homepage] => 0
[contenu] =>
)
)
J'ai besoin d'un petit coup de main, donc si vos neurones ne sont pas HS, je recherche une solution si elle existe, pour optimiser mon traitement actuel d'un tri sur un tableau à 2 dimensions.
Pour expliquer un peu mon code ci dessous :
- J'ai une série de fichiers texte contenant des données, dont une appelée "ordre", c'est celle-ci qui nous intéresse
- Je fait une première boucle pour rassembler tout le contenu de mes fichiers dans un tableau. Les clés du tableau sont les ID, les valeurs sont donc des tableaux contenant les données
- Ayant besoin de trier le tableau par rapport à la valeur "ordre" j'applique ma fonction de tri
- Mais la fonction de tri ne conservant pas mes clés, je suis obligé de les reconstituer avec une seconde fonction
Au final il m'aura donc fallu faire 3 foreach pour construire mon tableau, ce qui me semble beaucoup, mais je n'ai pas réussi a trouver d'autre solutions pour réduire les traitements.
Si vous avez quelques minutes à faire perdre a vos neurones,
Voici le code :
<?php
$pages = array();
foreach(scandir('data/pages/') as $k=>$fichier){
if(is_file('data/pages/'.$fichier) && $id = str_replace('.txt', '', $fichier)){
preg_match_all('#\[(.*)\]#Usi', file_get_contents('data/pages/'.$fichier), $matches);
foreach($matches[1] as $k2=>$ligne){
$temp = explode('|', $ligne);
$pages[$id][$temp[0]] = $temp[1];
}
}
}
print_r($pages);
$pages = tri_array($pages, 'ordre', 'num');
$pages = valeur_vers_cle($pages, 'id');
print_r($pages);
function tri_array($tableau, $cle, $mode){
if($mode == 'desc'){ $mode = SORT_DESC; }
elseif($mode == 'asc'){ $mode = SORT_ASC; }
elseif($mode == 'num'){ $mode = SORT_NUMERIC; }
$temp = array();
foreach($tableau as $k=>$v){
$temp[$k] = $v[$cle];
}
array_multisort($temp, $mode, $tableau);
return $tableau;
}
function valeur_vers_cle($tableau, $cle){
$temp = array();
foreach($tableau as $k=>$v){
$temp[$v[$cle]] = $v;
}
return $temp;
}
?>
Et voici le résultat de mes 2 print_r() qui est donc le résultat recherché :Array
(
[1] => Array
(
[id] => 1
[nom] => page
[ordre] => 2
[homepage] => 0
[contenu] =>
)
[2] => Array
(
[id] => 2
[nom] => page bis
[ordre] => 1
[homepage] => 1
[contenu] =>
)
)
Array
(
[2] => Array
(
[id] => 2
[nom] => page bis
[ordre] => 1
[homepage] => 1
[contenu] =>
)
[1] => Array
(
[id] => 1
[nom] => page
[ordre] => 2
[homepage] => 0
[contenu] =>
)
)