Optimisation du tri d'un tableau a 2 dimensions

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Optimisation du tri d'un tableau a 2 dimensions

Re: Optimisation du tri d'un tableau a 2 dimensions

par Nours312 » 19 mai 2010, 11:03

lol
c'est dans la construction de la variable $pages que j'y met la clé contenant la valeur de ordre
        $k = ''; // clé en charge récupérer l'ordre des éléments
        $arr = array("id"=>$id); // tableau tampon contenant la clé que tu souhaites récupéré par la suite ... non ?
        foreach($matches[1] as $k2=>$ligne) {
            $temp = explode('|', $ligne);
            $arr[$temp[0]] = $temp[1];
            if($temp[0] == $order)
                $k = $temp[1]; // création de la clé
        }
        $page[$k] = $arr ; 
par contre, c'est sur, qui si tu a plusieurs éléments ayant le meme "ordre", les premier seront écrasés par les suivant !...

Re: Optimisation du tri d'un tableau a 2 dimensions

par supercanard » 18 mai 2010, 23:28

Merci pour ton aide

Je crois que j'ai compris l'idée qui est surtout de modifier la fonction tri_array() comme ceci :
//$temp[$k] = $v[$cle];
$temp[$v[$cle]] = $v[$cle];
Par contre le hic c'est lorsqu'il y a des doublons de valeur ( plusieurs fois le même ordre ), dans ce cas petit warning. On pourrait ceci dit y remédier en combinant une boucle et un test sur in_array, avec incrémentation de la valeurs...

EDIT : Ah non en fait t'a complétement modifié la fonction de tri, je comprends pas comment tu fait du coups pour trier par rapport a l'ordre ???

Re: Optimisation du tri d'un tableau a 2 dimensions

par Nours312 » 18 mai 2010, 23:02

bon, j'ai ps de solutions miracle, mais y en a un de moins ^^ ... et ça devrait fonctionner tout autant :D
<?php
$pages = array();
$order = 'ordre';
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);
	$k = ''; // clé en charge récupérer l'ordre des éléments
	$arr = array("id"=>$id); // tableau tampon contenant la clé que tu souhaites récupéré par la suite ... non ?
	foreach($matches[1] as $k2=>$ligne) {
	    $temp = explode('|', $ligne);
	    $arr[$temp[0]] = $temp[1];
	    if($temp[0] == $order) 
		$k = $temp[1]; // création de la clé
	}
	$page[$k] = $arr ; // ajout du tableau tampon dans le tableau final en utilisant la clé souhaitée
    }
}

function tri_array($tableau, $cle, $mode = 'num') {
    $mode = ($mode == 'desc') ? SORT_DESC : (($mode == 'asc') ? SORT_ASC : SORT_NUMERIC) ; // récupération du format
    array_multisort($tableau, $mode);
    $temp = array();
    foreach($tableau as $k=>$v) {
	$temp[$v[$cle]] = $v; // remise en place de la clé initialement souhaitée ...
    }
    return $temp;
}

print_r($pages);
$pages = tri_array($pages, 'id');
print_r($pages);

?>
le principe est le suivant, pourquoi mettre une clé si ce n'est pas celle dont tu as besion !? autant mettre celle que tu souhaites utiliser :D

Optimisation du tri d'un tableau a 2 dimensions

par supercanard » 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 :
<?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] =>
)

)