Un tit casse tête de pondération ... [Résolu]

Messages postés
329
Date d'inscription
samedi 4 janvier 2003
Dernière intervention
29 mars 2015
- - Dernière réponse : cs_morpheus57
Messages postés
122
Date d'inscription
vendredi 31 mars 2006
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 !
@+
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
373
Date d'inscription
samedi 9 juillet 2005
Dernière intervention
11 août 2008
3
Merci
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)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Commenter la réponse de audayls
Messages postés
329
Date d'inscription
samedi 4 janvier 2003
Dernière intervention
29 mars 2015
3
0
Merci
    euh ..encore mieux si c'est possible en mysql direct ... ça peut le faire :)
m'enfin je crois pas :'(
Commenter la réponse de cs_caviar
Messages postés
329
Date d'inscription
samedi 4 janvier 2003
Dernière intervention
29 mars 2015
3
0
Merci
    YEah ! ça marche ...
bon maintenant faut que je comprenne ton algo ;)
merci
@++
Commenter la réponse de cs_caviar
Messages postés
122
Date d'inscription
vendredi 31 mars 2006
Dernière intervention
30 décembre 2010
1
0
Merci
Il y a une autre solution (et beaucoup plus simple) :
Tu fais une requete du style :
SELECT
FROM
GROUP BY
Commenter la réponse de cs_morpheus57
Messages postés
373
Date d'inscription
samedi 9 juillet 2005
Dernière intervention
11 août 2008
0
Merci
C'est vrai que si tu peux utiliser "GROUP BY" le code serait beaucoup plus leger.

For every choice, a consequence (Fable)
Commenter la réponse de audayls
Messages postés
389
Date d'inscription
lundi 7 juillet 2003
Dernière intervention
10 février 2009
0
Merci
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"
Commenter la réponse de cs_garfield90
Messages postés
122
Date d'inscription
vendredi 31 mars 2006
Dernière intervention
30 décembre 2010
1
0
Merci
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.
Commenter la réponse de cs_morpheus57
Messages postés
389
Date d'inscription
lundi 7 juillet 2003
Dernière intervention
10 février 2009
0
Merci
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"
Commenter la réponse de cs_garfield90
Messages postés
329
Date d'inscription
samedi 4 janvier 2003
Dernière intervention
29 mars 2015
3
0
Merci
    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à ?
Commenter la réponse de cs_caviar
Messages postés
122
Date d'inscription
vendredi 31 mars 2006
Dernière intervention
30 décembre 2010
1
0
Merci
Oui,
essayes ça :

SELECT x_coord, y_coord, count(*) as virtual_column FROM `coord` GROUP BY x_coord, y_coord;
Commenter la réponse de cs_morpheus57

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.