Un tit casse tête de pondération ...

Résolu
cs_caviar Messages postés 329 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 29 mars 2015 - 19 mars 2007 à 21:09
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010 - 21 mars 2007 à 14:35
    Salut ... alors voila je planche sur un truc en ce moment et j'ai un e problématique peu courante ...
dans une BDD j'ai deux champs
coord_x et coord_y ...ce sont des coordonnées de points
bon ... je récupère ces deux valeurs dans un tableau via php
j'aimerai arriver à pondérer le tableau en fonction du nombre de fois qu'apparait une paire de coordonnées et sortir un tableau avec toutes les coordonnées plus une colone qui servirait à savoir le nombre de fois qu'une paire apparait ...

exemple (ça sera plus compréhensible)

j'ai donc récup les valeurs de ma bdd

j'ai un tableau style

coord[1]['x'] = 10 ;
coord[1]['y'] = 10 ;

coord[2]['x'] = 10 ;
coord[2]['y'] = 10 ;

coord[3]['x'] = 10 ;
coord[3]['y'] = 15 ;

coord[4]['x'] = 30 ;
coord[4]['y'] = 40 ;

ici j'ai deux fois le couple x, y -> 10, 10
j'aimerai sortir un tableau

coord[1]['x'] = 10 ;
coord[1]['y'] = 10 ;
coord[1]['poids'] = 2;

coord[2]['x'] = 10 ;
coord[2]['y'] = 15 ;
coord[2]['poids'] = 1;

coord[3]['x'] = 30 ;
coord[3]['y'] = 40 ;
coord[3]['poids'] = 1;

vala ...
mais bon figurez vous que j'y arrive pas ...lol et j'ai l'impréssion que c'est pas si simple ...
alors si un génie du php peut me donner ne serai-ce qu'une piste :) ça serait cool !!
mercii !
@+

10 réponses

audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
19 mars 2007 à 22:24
Salut,
Je suis loin d'être un génie en PHP, et je pense que mon code peut être amplement amélioré mais pour le moment il fait son boulot ^^ :
<?php
function caviar($array) {
    $temp = array();
    $i = 0;
    while (isset($array[++$i])) {
        if (!is_null($array[$i]['x'])) {
            $j = $i;
            $k = 1;
            while (isset($array[++$j])) {
                if (!is_null($array[$j]['x']) AND $array[$j]['x'] === $array[$i]['x'] AND $array[$j]['y'] === $array[$i]['y']) {
                    $array[$j] = array('x' => NULL, 'y' => NULL);
                    $k++;
                }
            }
            $temp[] = array('x' => $array[$i]['x'], 'y' => $array[$i]['y'], 'poids' => $k);
        }
    }
    return $temp;
}

$coord = array();
$coord[1]['x'] = 10 ;
$coord[1]['y'] = 10 ;
$coord[2]['x'] = 10 ;
$coord[2]['y'] = 10 ;
$coord[3]['x'] = 10 ;
$coord[3]['y'] = 15 ;
$coord[4]['x'] = 30 ;
$coord[4]['y'] = 40 ;

print_r(caviar($coord));
?>

For every choice, a consequence (Fable)
3
cs_caviar Messages postés 329 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 29 mars 2015 2
19 mars 2007 à 21:29
    euh ..encore mieux si c'est possible en mysql direct ... ça peut le faire :)
m'enfin je crois pas :'(
0
cs_caviar Messages postés 329 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 29 mars 2015 2
20 mars 2007 à 09:41
    YEah ! ça marche ...
bon maintenant faut que je comprenne ton algo ;)
merci
@++
0
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
20 mars 2007 à 12:32
Il y a une autre solution (et beaucoup plus simple) :
Tu fais une requete du style :
SELECT
FROM
GROUP BY
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
20 mars 2007 à 18:28
C'est vrai que si tu peux utiliser "GROUP BY" le code serait beaucoup plus leger.

For every choice, a consequence (Fable)
0
cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Membre Dernière intervention 10 février 2009
20 mars 2007 à 22:09
function ponderationCoord($array){
    $nbCoord   = count($array);
    $pondCoord = array();

    if ( is_array($array) ){
        for( $i=1 ; $i<=$nbCoord ; $i++ ){
            if ( isset($array[$i]['x']) && isset($array[$i]['y']) ){
                if (isset($pondCoord[$array[$i]['x'].'_'.$array[$i]['y']]) ){
                    $pondCoord[$array[$i]['x'].'_'.$array[$i]['y']] += 1 ;
                }else{
                    $pondCoord[$array[$i]['x'].'_'.$array[$i]['y']] = 1;
                }
            }
        }
       
        $i = 1 ;
        $coord = array();
        foreach( $pondCoord as $key=>$value){
            list($x, $y) = explode('_', $key);
            $coord[$i]['x'] = $x ;
            $coord[$i]['y'] = $y ;
            $coord[$i]['poids'] = $value ;
            $i++;
        }
        return $coord ;
    }
    return false;
}

Je pense que ma version PHP est plus rapide car elle a une complexite n+m, m < n alors que la proposition ci-dessus a une compléxite n², mais je me trompe peut etre.

Voila, my 2 cents

"They are 10 sorts of persons whose understand binary and whose not"
0
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
21 mars 2007 à 09:44
Au contraire, il vaut mieux faire le traitement par la base de données.

Si tu as des traitements complexes, tu peux utiliser des stored procedure.
0
cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Membre Dernière intervention 10 février 2009
21 mars 2007 à 10:37
Comparons ce qui est comparable, je parlais des 2 facons PHP.
Pour la gestion BDD, ca depend de trop de parametre que l'on a pas.
- type et version de la BDD en autre

"They are 10 sorts of persons whose understand binary and whose not"
0
cs_caviar Messages postés 329 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 29 mars 2015 2
21 mars 2007 à 14:20
    Salut, et merci pour vos réponses.
La bdd est en mysql ... sous la forme
CREATE TABLE `coord` (
  `id_coord` int(11) NOT NULL auto_increment,
  `x_coord` int(11) NOT NULL default '0',
  `y_coord` int(11) NOT NULL default '0',
  `poids_coord` int(11) NOT NULL default '1',
  `reso_x` int(11) default NULL,
  `reso_y` int(11) default NULL,
  `page` varchar(255) default NULL,
  `click_coord` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id_coord`)
)

c'est possible avec une requette de savoir le nombre de fois qu'apparait le couple x_coord, y_coord et de rajouter un e colonne virtuelle avec cette valeur là ?
0
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
21 mars 2007 à 14:35
Oui,
essayes ça :

SELECT x_coord, y_coord, count(*) as virtual_column FROM `coord` GROUP BY x_coord, y_coord;
0
Rejoignez-nous