IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Tri particulier d'un tableau [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut Tri particulier d'un tableau
    voici mon tableau:
    [0] => Array
    (
    [id_rep] => 4
    [contenu] => lien cat
    [id_groupe] => 2
    )

    [1] => Array
    (
    [id_rep] => 6
    [contenu] => lien cat 2 description site
    [id_groupe] =>
    )

    [2] => Array
    (
    [id_rep] => 7
    [contenu] => san cat3 www
    [id_groupe] => 5
    )

    [3] => Array
    (
    [id_rep] => 7
    [contenu] => san cat3 www
    [id_groupe] => 4
    )

    a partir de ce tableau je souhaite avoir un 2eme tableau qui met ceux qui ont le meme id_rep dans la meme case mais en cancaténant les id_groupe en une seule chaine pour qu'il devient comme suit :
    [0] => Array
    (
    [id_rep] => 4
    [contenu] => lien cat
    [id_groupe] => 2
    )

    [1] => Array
    (
    [id_rep] => 6
    [contenu] => lien cat 2 description site
    [id_groupe] =>
    )

    [2] => Array
    (
    [id_rep] => 7
    [contenu] => san cat3
    [id_groupe] => 5 4
    )

    l'algorithme est le suivant :
    si id_rep n'existe pas dans le tableau alors on rajoute la case correspondante , si id_rep existe deja alors on ne rajoute pas la ligne mais on rajoute plutot la valeure id_groupe a celle qui existe deja (cancaténation)

    mais je ne suis pas très callé en php et je galère depuis 8h dessus.
    j'aimerai savoir techniquement comment cela est fesable.
    merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 265
    Points : 281
    Points
    281
    Par défaut
    A voir en condition réelles mais normalement ce code est fonctionnel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <?php
     
    $source=array(
    	array(
    		'id_rep'=>4,
    		'contenu'=>'lien cat',
    		'id_groupe'=>2
    	),
    	array(
    		'id_rep'=>6,
    		'contenu'=>'lien cat 2 description site',
    		'id_groupe'=>null
    	),
    	array(
    		'id_rep'=>7,
    		'contenu'=>'sans cat 3 www',
    		'id_groupe'=>5
    	),
    	array(
    		'id_rep'=>7,
    		'contenu'=>'sans cat 3 www',
    		'id_groupe'=>4
    	)
    );
    print_r($source);
     
    $temp=array();
    foreach ($source as $item)
    {
    	if (isset($temp[$item['id_rep']]) && !empty($item['id_groupe']))
    		$temp[$item['id_rep']][0].=' '.$item['id_groupe'];
    	else
    		$temp[$item['id_rep']]=array($item['id_groupe'],$item['contenu']);
    }
     
    $result=array();
    foreach ($temp as $key=>$value)
    {
    	$result[]=array(
    		'id_rep'=>$key,
    		'contenu'=>$value[1],
    		'id_groupe'=>$value[0],
    	);
    }
     
    print_r($result);
    Par contre il y a trois choix "arbitraires" : on considère que "id_rep" est toujours présent (pas de vérification), on n'ajoute pas un "id_groupe" qui est nul et le "contenu" gardé est celui du premier élément trouvé.
    Il suffit de modifier les conditions dans les boucles pour changer ces comportements.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    merci pour la reponse , entre temps j'ai reussi à le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    foreach ($motsCle as $cle => $val) {
    			if (!in_array($motsCle[$cle]['id_rep'],$resultat_id)) {
    				$resultat_id[] = $motsCle[$cle]['id_rep'];
    				$resultat[$motsCle[$cle]['id_rep']] = Array (
    									'id_rep'=> $motsCle[$cle]['id_rep'],
    									'contenu'=> $motsCle[$cle]['contenu'],
    									'id_groupe'=> $motsCle[$cle]['id_groupe']
    									);
    			}	else {
    				$resultat[$motsCle[$cle]['id_rep']]['id_groupe'].=','.$motsCle[$cle]['id_groupe'];
    			}			
    		}
    ca fait le travail et me retourne le tableau $resultat

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB6]Tri multi-colonnes sur tableau de structure
    Par ELGUEVEL dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/02/2006, 08h02
  2. tri d'index de tableau par rapport au contenu
    Par parisien dans le forum C
    Réponses: 7
    Dernier message: 13/02/2006, 23h32
  3. [ListView] tri particulier (comparaison numérique)
    Par Cybher dans le forum C++Builder
    Réponses: 16
    Dernier message: 28/07/2005, 14h12
  4. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38
  5. Réponses: 2
    Dernier message: 08/04/2004, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo