IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Array valeur la plus proche [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 17
    Points
    17
    Par défaut Array valeur la plus proche
    Bonjour,

    J'ai un array et je souhaite avoir l'entrée qui contient la valeur la plus proche d'une d'une variable.
    Voici mon array
    Et je cherche à avoir la valeur servitude la plus proche.
    Par ex si j'ai un voltage de 12, je souhaite obtenir donc les données la troisième entrée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Array ( 
    	[0] => Array ( [id] => 1 [price] => 68.333333 [product_features] => Array ( [voltage] => 8 ) ) 
    	[1] => Array ( [id] => 2 [price] => 79.166667 [product_features] => Array ( [voltage] => 19 ) ) 
    	[2] => Array ( [id] => 3 [price] => 99.166667 [product_features] => Array ( [voltage] => 10 ) ) 
    	)
    Merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu parcoures ton tableau ligne par ligne :
    - pour chaque ligne, tu calcules la différence
    - si la différence est inférieure à la dernière différence calculée, cette ligne devient la meilleure donnée trouvée
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Je vois le principe mais je suis pas un pro du php…
    Je suis capable de le faire mais mon code sera assez lourd étant donné que je ne sais faire que des "bidouilages" PHP.
    Si quelqu'un a une fonction que je peux adapter je suis preneur!

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    alors commence par faire ton "bidouillage".

    On verra après si on peut optimiser.

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Ok alors voila le début, je calcule la différence entre ma valeur et celle de mon tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $somme = '12';
    foreach ($products as $product) {
                        	$voltage = $product['product_features']['capacite'];
                        	$resultat = $somme - $voltage;
                        }

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est une question de logique et de conception.
    Pas de PHP.

    Si tu "vois le principe", mets des mots dessus. Le code suivra.

    sabotage t'en a donné les grandes lignes.
    A toi d'y regarder en détails.

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Oui sauf que maintenant je suis un peu bloqué. J'ai bien la différence entre les 2 valeurs pour chaque entrée, maintenant comment n'avoir l'entrée la plus petite de mon tableau.
    Il faut que je fasse un tri croissant de ma nouvelle valeur que j'ai calculé mais comment? je peux sauvegarder la valeur et ensuite faire mon tri?

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je n'ai pas parlé de tri ; c'est une méthode possible mais ça va être moins efficace.

    Ce que j'ai proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $somme = 12; // sans guillemets
     
    foreach ($products as $id=>$product) {
    	$ecart = abs($somme - $product['product_features']['capacite']);
     
    	// si on est sur la première ligne, ou si l'écart est plus petit, on stocke les infos
    	if (!isset($plusproche) || $ecart < $plusproche['ecart']) { $plusproche = array('id'=>$id, 'ecart'=>$ecart); }
    }
     
    echo $products[$plusproche]['product_features']['capacite'];
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Merci.

    Par contre, j'obtiens un
    Warning: Illegal offset type in pour la ligne suivante:
    echo $products[$plusproche]['product_features']['capacite'];

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pardon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $products[$plusproche['id']]['product_features']['capacite'];
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Hum, toujours une erreur

    Notice: Undefined offset: 137 sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $products[$plusproche['id']]['product_features']['capacite'];

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Cette ligne n'existe pas dans $products ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    ce n'est pas ['capacite'] mais ['voltage'].


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <?php
    $voltage_voulu = 12; // sans guillemets
     
    $products = array ( 
    	0 => array ( 
    		'id' => 1, 
    		'price' => 68.333333, 
    		'product_features' => array ( 'voltage' => 8 ) 
    	) ,
    	1 => array ( 
    		'id' => 2, 
    		'price' => 79.166667, 
    		'product_features' => array ( 'voltage' => 19 ) 
    	),
    	2 => array ( 
    		'id' => 3, 
    		'price' => 99.166667, 
    		'product_features' => array ( 'voltage' => 10 ) 
    		)
    	);
    var_dump($products);
     
    foreach ($products as $id=>$product) {
    	$ecart = abs($voltage_voulu - $product['product_features']['voltage']);
     
    	// si on est sur la première ligne, ou si l'écart est plus petit, on stocke les infos
    	if (!isset($plusproche) || $ecart < $plusproche['ecart']) { $plusproche = array('id'=>$id, 'ecart'=>$ecart); }
    }
     var_dump($plusproche);
     
    echo 'Le voltage le plus proche est : '.$products[$plusproche['id']]['product_features']['voltage'];
    echo 'Les données pour ce voltage sont : ';
    var_dump($products[$plusproche['id']]);
     
    ?>

  14. #14
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Ok merci je vais me débrouiller avec ça

  15. #15
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Je réouvre la discussion, j'ai besoin d'affiner mon résultat.
    Cette fois je veux comme résultat l'entrée qui contient les 2 valeurs plus petites

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Array ( 
    	[0] => Array ( [id] => 1 [price] => 68.333333 [product_features] => Array ( [voltage] => 8 ) [product_features] => Array ( [test] => 9 ) ) 
    	[1] => Array ( [id] => 2 [price] => 79.166667 [product_features] => Array ( [voltage] => 30 ) [product_features] => Array ( [test] => 3 ) ) 
    	[2] => Array ( [id] => 3 [price] => 99.166667 [product_features] => Array ( [voltage] => 10 ) [product_features] => Array ( [test] => 7 ) ) 
    	)
    Je souhaite l'entrée qui contient les valeurs 'voltage' et 'test' les plus petites. Il me faut donc comme résultat la troisième entrée

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    tu es bien gentil, mais on n'est pas là pour faire tout le boulot à ta place...


    Sers-toi un peu de ta tête.

  17. #17
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    IL va falloir que tu affines un peu ta demande : si tu cherches l'entrée qui la plus petite valeur de voltage et de test, que se passe-t-il si ce sont deux entrées différentes ?
    Là dans ton exemple, la plus petite valeur de test est la ligne 2 alors que la plus petite valeur de voltage est la ligne 3. Donc comment détermines-tu que c'est la ligne 3 dont tu as besoin ?

    Au fait, il ya une raison pour laquelle ce post est dans le forum PHP & Mysql ? Des données viennent d'une base peut-être ? Si c'est le cas, ça pourrait être intéressant de faire le filtre directement lors de la recherche en base...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  18. #18
    Membre à l'essai
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 17
    Points
    17
    Par défaut
    Hops, j'avais pas valider ma réponse…
    Bon je me suis débrouillé en contournant le problème.
    @jreaux62, avec le code que tu m'as donné, si J'ai 2 valeurs égale, le code ne m'en ressort qu'une seule (logique), comment faire pour que ça me donne la ou les plus petites si il y a plusieurs valeurs égales.
    J'ai pensé à construire un array mais ça ne fonctionne pas, j'obtiens qu'une seule entré dans mon tableau

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
    $plusproche = array(); // array des produits les plus proches
    foreach ($products as $id=>$product) {
    	$ecart = floatval(abs($voltage_voulu - $product['product_features']['voltage']));
    	// si on est sur la première ligne, ou si l'écart est plus petit, on stocke les infos
    	if (!isset($plusproche_ecart) || $ecart < $plusproche_ecart) { 
    		unset($plusproche); // on vide
    		$plusproche = array();
    		$plusproche[$id] = $product;
    		$plusproche_ecart = $ecart;
    	} elseif ($ecart == $plusproche_ecart) { // si même écart : on ajoute
    		$plusproche[$id] = $product; 
    		$plusproche_ecart = $ecart;
    	}
     
    }
    //var_dump($plusproche);
     
    echo 'Voltage voulu : '.$voltage_voulu.'<br />';
    if( !empty($plusproche) )
    {
    	echo ( count($plusproche) > 1 )? 'Les voltage les plus proches sont : ' : 'Le voltage le plus proche est : ';
    	echo '<ul>';
    	foreach( $plusproche as $id=>$product )
    	{
    		echo '<li>'.$product['product_features']['voltage'].' ('.$product['price'].')'.'</li>';
    	}
    	echo '</ul>';
    } else {
    	echo 'Pas de correspondance.';
    }
    ?>

    Exemple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?php
    $voltage_voulu = 9; // sans guillemets
     
    $products = array ( 
    	0 => array ( 
    		'id' => 1, 
    		'price' => 68.333333, 
    		'product_features' => array ( 'voltage' => 8 ) 
    	) ,
    	1 => array ( 
    		'id' => 2, 
    		'price' => 79.166667, 
    		'product_features' => array ( 'voltage' => 19 ) 
    	),
    	2 => array ( 
    		'id' => 3, 
    		'price' => 99.166667, 
    		'product_features' => array ( 'voltage' => 10 ) 
    	),
    	3 => array ( 
    		'id' => 4, 
    		'price' => 44.55, 
    		'product_features' => array ( 'voltage' => 14 ) 
    	),
    	5 => array ( 
    		'id' => 6, 
    		'price' => 66.77, 
    		'product_features' => array ( 'voltage' => 8 ) 
    	),
    	);
    //var_dump($products);

    L'exemple donne :
    Voltage voulu : 9
    Les voltage les plus proches sont :
    • 8 (68.333333)
    • 10 (99.166667)
    • 8 (66.77)

  20. #20
    Invité
    Invité(e)
    Par défaut
    On peut aussi le mettre dans une fonction :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function get_plus_proches_voltages_array( $products, $voltage_voulu )
    {
    	$plusproche = array();
    	foreach ($products as $id=>$product) {
    		$ecart = floatval(abs($voltage_voulu - $product['product_features']['voltage']));
    		// si on est sur la première ligne, ou si l'écart est plus petit, on stocke les infos
    		if (!isset($plusproche_ecart) || $ecart < $plusproche_ecart) { 
    			unset($plusproche); // on vide
    			$plusproche = array();
    			$plusproche[$id] = $product;
    			$plusproche_ecart = $ecart;
    		} elseif ($ecart == $plusproche_ecart) { // si même écart : on ajoute
    			$plusproche[$id] = $product; 
    			$plusproche_ecart = $ecart;
    		}
     
    	}
    	return $plusproche;
    }

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo 'Voltage voulu : '.$voltage_voulu.'<br />';
     
    $plusproche = get_plus_proches_voltages_array( $products, $voltage_voulu );
    //var_dump($plusproche);
    //.....

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. La valeur la plus proche
    Par tripper.dim dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/09/2009, 17h32
  2. acces dans un treemap a la valeur la plus proche
    Par pcouas dans le forum Langage
    Réponses: 0
    Dernier message: 16/04/2009, 12h07
  3. [MySQL] Extraire les 50 valeurs les plus proches d'un entier
    Par denis.ws dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 19/01/2007, 08h42
  4. [Oracle] selectionner la valeur la plus proche
    Par jaoued dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/03/2006, 21h15
  5. Récupurer via une requête SQL la valeur la plus proche
    Par yoda_style dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/04/2004, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo