manipulation d'un tableau multidimensionnel

HD
Mammouth du PHP | 1181 Messages

30 déc. 2006, 19:29

bonjour
j'ai un tableau qui a cette forme : $tableau[$cat][$cle] (cat : catégorie ; cle : clé)
en fait le but ici est de sélectionné les clés qui apparaissent dans au moins 2 catégories

exemple

Code : Tout sélectionner

catégorie 1 : clés : 1->Valeur1 2->Valeur2 3->Valeur3 4->Valeur4 catégorie 2 : clés : 1->Valeur5 2->Valeur1 3->Valeur6 4->Valeur3 catégorie 3 : clés : 1->Valeur7 2->Valeur2
donc on doit afficher les valeurs Valeur1, Valeur2 et Valeur3

reste à coder ça donc si quelqu'un a une piste... merci !
Modifié en dernier par HD le 30 déc. 2006, 19:41, modifié 3 fois.
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

ViPHP
ViPHP | 3607 Messages

30 déc. 2006, 19:33

j'ai beaucoup de mal à voir ton tableau, remet le en forme... stp

HD
Mammouth du PHP | 1181 Messages

30 déc. 2006, 19:42

c'est fait !

ps: jojolapine on se croise souvent ces derniers temps :wink:
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

Mammouth du PHP | 1885 Messages

30 déc. 2006, 19:45

Je suppose qu'on peut déclarer ton tableau de test ainsi:
$array = array();
$array[1][] = 'Valeur1';
$array[1][] = 'Valeur2';
$array[1][] = 'Valeur3';
$array[1][] = 'Valeur4';
$array[2][] = 'Valeur5';
$array[2][] = 'Valeur1';
$array[2][] = 'Valeur6';
$array[2][] = 'Valeur3';
$array[3][] = 'Valeur7';
$array[3][] = 'Valeur2';
Je te reviens avec une solution. J'ai posté ceci seulement pour facilier la recherche de solutions pour les autres.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Mammouth du PHP | 1885 Messages

30 déc. 2006, 19:51

Il est possible de vérifier l'intersection pour plusieurs tableaux:
<?php
$array = array();

$array[1][] = 'Valeur1';
$array[1][] = 'Valeur2';
$array[1][] = 'Valeur3';
$array[1][] = 'Valeur4';

$array[2][] = 'Valeur5';
$array[2][] = 'Valeur1';
$array[2][] = 'Valeur6';
$array[2][] = 'Valeur3';

$array[3][] = 'Valeur7';
$array[3][] = 'Valeur2';
$array[3][] = 'Valeur1';

$results = call_user_func_array('array_intersect', $array);

print_r($results);
?>
Cependant, il n'y a pas de fonctions permettant d'afficher les intersections pour un minimum. Il faudrait procéder à une boucle sur les catégories et à plusieurs tests.

Je laisse un peu aventureux que moi coder ce genre de fonction.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Mammouth du PHP | 1885 Messages

30 déc. 2006, 20:12

Petit vénard, j'ai eu un éclair de génie en me rappelant mes diagrammes de Venn:
<?php
function array_intersect_min2($array) {
    
    $singles = array();
    $many = array();
    
    foreach ($array as $subarray) {
        
        // Retrait des valeurs en double
        $subarray = array_unique($subarray);
        
        // On compare avec les singles actuels
        $found = array_intersect($singles, $subarray);
        
        // On retire ceux trouvé du tableau actuel
        // Pour mieux les intégrés aux singles
        $subarray = array_diff($subarray, $found);
        $singles = array_merge($singles, $subarray);
        
        // On note les doubles
        $many = array_merge($many, $found);
    }
    
    // On clean encore
    // Car la valeur aurait pu être retrouvé dans plus de 2
    $many = array_unique($many);
    
    return $many;
}

$array = array();
$array[1][] = 'Valeur1';
$array[1][] = 'Valeur2';
$array[1][] = 'Valeur3';
$array[1][] = 'Valeur4';

$array[2][] = 'Valeur5';
$array[2][] = 'Valeur1';
$array[2][] = 'Valeur6';
$array[2][] = 'Valeur3';

$array[3][] = 'Valeur7';
$array[3][] = 'Valeur2';
$array[3][] = 'Valeur1';

$results = array_intersect_min2($array);

print_r($results);
?>
Affichera:

Code : Tout sélectionner

Array ( [0] => Valeur1 [1] => Valeur3 [3] => Valeur2 )
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

HD
Mammouth du PHP | 1181 Messages

30 déc. 2006, 20:27

merci beaucoup ! je teste et je répond
ps: diagrammes de Venn :shock: http://fr.wikipedia.org/wiki/Diagramme_de_Venn
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

HD
Mammouth du PHP | 1181 Messages

30 déc. 2006, 21:44

Excellent !
Désolé mais encore une chose (plus compliquée?) :
je suis entrain d'adapter ce script pour ne garder que les valeurs qui apparaissent dans TOUTES les catégories
donc si quelqu'un y arrive avant moi ce serait très sympa de poster le code ici
merci !
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

Mammouth du PHP | 1885 Messages

30 déc. 2006, 21:54

Alors mon premier code s'applique:
<?php
$array = array();

$array[1][] = 'Valeur1';
$array[1][] = 'Valeur2';
$array[1][] = 'Valeur3';
$array[1][] = 'Valeur4';

$array[2][] = 'Valeur5';
$array[2][] = 'Valeur1';
$array[2][] = 'Valeur6';
$array[2][] = 'Valeur3';

$array[3][] = 'Valeur7';
$array[3][] = 'Valeur2';
$array[3][] = 'Valeur1';

$results = call_user_func_array('array_intersect', $array);

print_r($results);
?>
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

HD
Mammouth du PHP | 1181 Messages

30 déc. 2006, 22:03

excellent ! merci beaucoup !!!
bonne soirée :D
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

HD
Mammouth du PHP | 1181 Messages

30 déc. 2006, 22:32

humm c'est pas fini apparament :?
j'ai dans mon code un tableau qui a cette forme : $tableau[$cat][$cle]=valeur
($cat et $cle sont des chiffres, valeur aussi)
or quand je met :
$results = call_user_func_array('array_intersect', $tableau);
foreach($results as $valeur){
j'ai l'erreur :
Warning: Wrong parameter count for array_intersect() in *** on line 752

Warning: Invalid argument supplied for foreach() in *** on line 753
ligne 752 : $results = call_user_func_array('array_intersect', $tableau);
ligne 753 : foreach($results as $valeur) (mais c'est normal d'avoir cette erreur puisque $results est faux)
merci
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

Mammouth du PHP | 1885 Messages

30 déc. 2006, 22:41

Combien d'index as-tu à $tableau? Il en faut 2 minimum.

call_user_func_array() va appeler array_intersect() ainsi:
array_intersect($tableau[0], $tableau[1], $tableau[n], ...);
Donc si y'a un seul index, array_intersect() aimera pas car il faut au moins 2 arguments.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

HD
Mammouth du PHP | 1181 Messages

30 déc. 2006, 22:48

je viens de vérifier et t'a raison
en fait tableau a toujours entre 0 et 5 sous-tableaux
pour de 2 à 5 sous-tableaux ca marche bien.
mais comment vérifier si c'est 0 ou 1 ?
merci bcp
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

Mammouth du PHP | 1885 Messages

30 déc. 2006, 23:18

count() ?
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

HD
Mammouth du PHP | 1181 Messages

30 déc. 2006, 23:45

count() ?
bien sur :oops: merci =D>
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]