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

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:
Posté : 30 déc. 2006, 20:27
par HD
merci beaucoup ! je teste et je répond
ps: diagrammes de Venn
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

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

merci =D>