Page 1 sur 2

manipulation d'un tableau multidimensionnel

Posté : 30 déc. 2006, 19:29
par HD
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 !

Posté : 30 déc. 2006, 19:33
par jojolapine
j'ai beaucoup de mal à voir ton tableau, remet le en forme... stp

Posté : 30 déc. 2006, 19:42
par HD
c'est fait !

ps: jojolapine on se croise souvent ces derniers temps :wink:

Posté : 30 déc. 2006, 19:45
par Xenon_54
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.

Posté : 30 déc. 2006, 19:51
par Xenon_54
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.

Posté : 30 déc. 2006, 20:12
par Xenon_54
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 )

Posté : 30 déc. 2006, 20:27
par HD
merci beaucoup ! je teste et je répond
ps: diagrammes de Venn :shock: http://fr.wikipedia.org/wiki/Diagramme_de_Venn

Posté : 30 déc. 2006, 21:44
par HD
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 !

Posté : 30 déc. 2006, 21:54
par Xenon_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);
?>

Posté : 30 déc. 2006, 22:03
par HD
excellent ! merci beaucoup !!!
bonne soirée :D

Posté : 30 déc. 2006, 22:32
par HD
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

Posté : 30 déc. 2006, 22:41
par Xenon_54
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.

Posté : 30 déc. 2006, 22:48
par HD
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

Posté : 30 déc. 2006, 23:18
par Xenon_54
count() ?

Posté : 30 déc. 2006, 23:45
par HD
count() ?
bien sur :oops: merci =D>