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

cs_caviar 329 Messages postés samedi 4 janvier 2003Date d'inscription 29 mars 2015 Dernière intervention - 19 mars 2007 à 21:09 - Dernière réponse : cs_morpheus57 122 Messages postés vendredi 31 mars 2006Date d'inscription 30 décembre 2010 Dernière intervention
- 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
audayls 373 Messages postés samedi 9 juillet 2005Date d'inscription 11 août 2008 Dernière intervention - 19 mars 2007 à 22:24
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)

Merci audayls 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de audayls
cs_caviar 329 Messages postés samedi 4 janvier 2003Date d'inscription 29 mars 2015 Dernière intervention - 19 mars 2007 à 21:29
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
cs_caviar 329 Messages postés samedi 4 janvier 2003Date d'inscription 29 mars 2015 Dernière intervention - 20 mars 2007 à 09:41
0
Merci
    YEah ! ça marche ...
bon maintenant faut que je comprenne ton algo ;)
merci
@++
Commenter la réponse de cs_caviar
cs_morpheus57 122 Messages postés vendredi 31 mars 2006Date d'inscription 30 décembre 2010 Dernière intervention - 20 mars 2007 à 12:32
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
audayls 373 Messages postés samedi 9 juillet 2005Date d'inscription 11 août 2008 Dernière intervention - 20 mars 2007 à 18:28
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
cs_garfield90 389 Messages postés lundi 7 juillet 2003Date d'inscription 10 février 2009 Dernière intervention - 20 mars 2007 à 22:09
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
cs_morpheus57 122 Messages postés vendredi 31 mars 2006Date d'inscription 30 décembre 2010 Dernière intervention - 21 mars 2007 à 09:44
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
cs_garfield90 389 Messages postés lundi 7 juillet 2003Date d'inscription 10 février 2009 Dernière intervention - 21 mars 2007 à 10:37
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
cs_caviar 329 Messages postés samedi 4 janvier 2003Date d'inscription 29 mars 2015 Dernière intervention - 21 mars 2007 à 14:20
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
cs_morpheus57 122 Messages postés vendredi 31 mars 2006Date d'inscription 30 décembre 2010 Dernière intervention - 21 mars 2007 à 14:35
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.