manipulation d'un tableau multidimensionnel

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 : manipulation d'un tableau multidimensionnel

par HD » 01 janv. 2007, 00:16

:? je ne connais pas SQLite et je me demande si tous les hébérgeurs la supportent :?

par Xenon_54 » 01 janv. 2007, 00:00

En effet, la comparaison se faire sur array1 seulement:
array_intersect() retourne un tableau contenant toutes les valeurs de array1 qui sont présentes dans tous les autres arguments array2, ..., etc. Notez que les clés sont préservées.
Donc si tu as ceci:

ArrayA = 1,2,3
ArrayB = 1,2,4
ArrayC = 1,3,4

Seulement la valeur 1,2,3,5 sera retournée.
1 sera retourné car présent dans A, B et C
2 sera retourné car présent dans A et B
3 sera retourné car présent dans A et C
4 ne sera pas retourné car dans B et C, pas A

Rendu là, il faudrait passer par SQL ou SQLite en créant une table temporaire en mémoire:
Note : Depuis SQLite version 2.8.2, vous pouvez spécifier :memory: comme valeur de filename pour créer une base qui sera installée en mémoire vive, sur le serveur. C'est très pratique pour des traitements temporaires, car la base en mémoire sera détruire dès que le script sera terminé. Cela peut aussi être utile, lorsqu'utilisé conjointement avec la commande SQL ATTACH DATABASE, pour charger d'autres bases, et faire des requêtes liées.
http://ca3.php.net/manual/fr/function.sqlite-open.php

par HD » 31 déc. 2006, 22:19

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
salut
après plusieurs tests array_intersect semble retourner les résultats présents dans au moins 2 index de mon tableau (alors qu'elle est censée retourner les intersect présents dans tous les index) :? :?
je suis entrain de tester array_intersect_assoc qui semble retourner les éléments présents dans tous mes index...

par HD » 30 déc. 2006, 23:45

count() ?
bien sur :oops: merci =D>

par Xenon_54 » 30 déc. 2006, 23:18

count() ?

par HD » 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

par Xenon_54 » 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.

par HD » 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

par HD » 30 déc. 2006, 22:03

excellent ! merci beaucoup !!!
bonne soirée :D

par Xenon_54 » 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);
?>

par HD » 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 !

par HD » 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

par Xenon_54 » 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 )

par Xenon_54 » 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.

par Xenon_54 » 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.