• STATISTIQUES
  • Il y a eu un total de 4 membres et 4801 visiteurs sur le site dans les dernières 24h pour un total de 4 805 personnes!


    2 membres se sont inscrits dans les dernières 24h!


    Membres: 2 608
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] Framework Metasploit
    Le Framework Metasploit est un logiciel gratuit, open source de tests de pénétration développ&ea...
    Vulnérabilités
    [FR] PHP France
    Pour tout savoir sur le PHP, en français. Vous trouverez des tutoriels, des exemples, des astuces, toute la do...
    Hacking
    [FR] Forum-Webmaster
    Une communauté webmaster pour apporter / recevoir de l'aide en création de site internet. Webmaster...
    Webmaster
    [EN] Big-Daddy
    Big-Daddy est site internet communautaire avec un effectif diversifié, y compris des artistes, des programmeur...
    Hacking
    [EN] Gekko
    Site de challenge présenter sous la forme d'une quête. Vous êtes un agent secret qui répond sous le nom...
    Challenges
    [FR] Root-me
    Script: 5, Système: 20, Cracking: 16, Cryptanalyse: 17, Programmation: 8, Réaliste: 11, Réseau: 10, Stéganog...
    Challenges
    [FR] Infomirmo
    Challenge présenté sous la forme de 6 niveaux de difficultés diverses et variées avec chacun plusieurs chall...
    Challenges

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[PHP] Quel nombre est le plus proche ?
08-11-2014, 19h45 (Modification du message : 10-11-2014, 14h24 par WizOut.)
Message : #1
WizOut Hors ligne
Black Slave Coder
*



Messages : 111
Sujets : 13
Points: 14
Inscription : Apr 2012
[PHP] Quel nombre est le plus proche ?
Bonjour / Bonsoir,

Aujourd'hui j'ai eu besoin de faire une fonction pour un de mes programmes permettant de savoir à partir d'un tableau composé de valeur numérique quel nombre est le plus proche de x où x est un réel.

je vous met le prototype qui est :

Code PHP :
    function compare($signe$const, &$tab$returnIndice); 

$signe : peut prendre deux valeurs : "<" si on veut la valeur inférieur à $const la plus proche ou ">" si on veut la valeur supérieur à $const la plus proche.
$const : le nombre auquel on veut se rapprocher
&$tab : c'est le tableau de valeur
$returnIndice : deux valeurs possibles "true" ou "false" ça nous retourne en plus de la valeur approchée de $const , son indice dans le tableau...

Un exemple est toujours mieux qu'un long discours Smile donc c'est parti :

Code PHP :
<?php
$montableau 
= [520891251000, -5, -125];

// Je veux la valeur supérieur la plus proche de 80
echo "Valeur superieur de 80 : " compare(">"80$montableaufalse) . "<br />";

// Je veux la valeur inférieur la plus proche de 80
echo "Valeur inferieur de 80 : " compare("<"80$montableaufalse) . "<br />";
?>

Resultat :
Code :
Valeur superieur de 80 : 125
Valeur inferieur de 80 : 20

Voilà le fonctionnement assez simple, mais imaginons que vous avez deux fois 125 dans votre tableau, comment le programme va réagir ? il va créer un tableau multidimensionnel si vous voulez les indices, ou bien unidimensionnel (ça peut servir pour compter le nombre de doublons) si vous ne voulez pas d'indice. Exemple :

Code PHP :
<?php
$montableau 
= [520125891251000, -5, -125];

// Je veux la valeur supérieur la plus proche de 80 avec les indices 
echo print_r(compare(">"80$montableautrue));

// Je veux la valeur supérieur la plus proche de 80 sans indices
echo print_r(compare(">"80$montableaufalse));

?>

Résultat :
Code :
Array ( [0] => Array ( [0] => 125 [1] => 5 )
        [1] => Array ( [0] => 125 [1] => 2 ) )

Array ( [0] => 125
        [1] => 125 )

Voila en gros, pour 125 on le retrouve à l'indice 5 et 2 de $montableau.
Cette fonction peut toujours servir, ne là sous-estimez pas Wink
Ah j'allais oublier le code :

Code PHP :
    function compare($signe$const, &$tab$returnIndice) {
        
$a = [max($tab), min($tab)];

        if (
$const >= $a[0] && $signe == ">" || $const <= $a[1] && $signe == "<") {
            return 
NULL;
        } else {
            
$double false;
            
$multiDouble = []; // Tableau contenant les doublons... Si par exemple il y a 2 fois une même valeur la plus proche possible par valeur supérieur de $x ou $y

            
if ($signe == ">") {

                
$val 10000;
                
$indice 0;


                for (
$i 0$i count($tab); $i++) {

                    if (
$tab[$i] > $const && $tab[$i] < $val) {
                        
$val $tab[$i];
                        
$indice $i;
                    } else if (
$tab[$i] == $val && $returnIndice) {
                        
$double true;
                        
array_push($multiDouble, [$val$i]);
                    } else if (
$tab[$i] == $val && !$returnIndice) {
                        
$double true;
                        
array_push($multiDouble$val);
                    }
                }

                if (
$double && !$returnIndice) {
                    
array_push($multiDouble$val);
                } else if (
$double && $returnIndice) {
                    
array_push($multiDouble, [$val$indice]);
                }

                if (
$double) {
                    return 
$multiDouble;
                } else {

                    if (
$returnIndice) {
                        return [
$val$indice];

                    } else {
                        return 
$val;
                    }
                }


            } else if (
$signe == "<") {

                
$plusPetiteValeurMultiArray = []; // Contient  valeur + indice [ [valeur, indice ], [valeur, indice], [valeur, indice] ] -> elements plus petit que $x
                
$plusPetiteValeurArray = []; // Contient uniquement les plus petites valeurs (tableau unidimensionnel) 

                
for ($i 0$i count($tab); $i++) {
                    if (
$tab[$i] < $const ) {
                        
array_push($plusPetiteValeurMultiArray, [$tab[$i], $i]);
                        
array_push($plusPetiteValeurArray$tab[$i]);
                    }
                }

                
$doublons = []; // Tableau qui contiendra les valeurs doublés dans le tableau

                
$array_unique array_unique($plusPetiteValeurArray); 

                   if (
count($plusPetiteValeurArray) - count($array_unique)){ 
                    for (
$i 0$i<count($plusPetiteValeurArray); $i++) {
                        if (!
array_key_exists($i$array_unique)) 
                            
$doublons[] = $plusPetiteValeurArray[$i];
                    } 
                } 

                foreach (
$doublons as $element) {
                    if (
$element == max($plusPetiteValeurArray)) {
                        
$double true;
                    }
                }

                if (
$double) {
                    for (
$i 0$i count($tab); $i++) {
                        if (
$tab[$i] == max($plusPetiteValeurArray)) {
                            if (
$returnIndice) {
                                
array_push($multiDouble, [max($plusPetiteValeurArray), $i]);

                            } else {
                                
array_push($multiDoublemax($plusPetiteValeurArray));
                            }
                        }
                    }
                    return 
$multiDouble;
                } else {


                    for (
$i 0$i count($tab); $i++) {

                            if (
$tab[$i] == max($plusPetiteValeurArray)){
                                if (
$returnIndice) {
                                    
$result = [max($plusPetiteValeurArray), $i];
                                } else {
                                    
$result max($plusPetiteValeurArray);
                                }
                            } 
                    }
                    return 
$result;
                }

            }
        }
    } 
"Il existe deux choses infinies : l'univers et la bêtise humaine" Einstein.
PHP/MySQL (POO & PDO) : OK
HTML5/CSS3 : OK
JAVA : En cours
+1 (0) -1 (0) Répondre
09-11-2014, 15h06
Message : #2
cacaphonie Hors ligne
Newbie
*



Messages : 12
Sujets : 3
Points: 11
Inscription : Oct 2014
RE: [PHP] Quel nombre est le plus proche ?
Salut,
moi je viens de faire qu'en utilisant des if, j'aurais p-e pu utiliser switch mais je sais pas pourquoi j'ai fait, j'ai fait comme ça : (pas testé le code dsl juste pour te donner une idée de ce que j'ai fait):
Code PHP :
<?PHP

function compare($valeurA$signe$valeurB)
        {
                if(
$signe == ">")
                        {
                                if(
$valeurA $valeurB)
                                        {
                                                echo 
"$valeurA est plus grand que $valeurB";
                                        }
                                else
                                        {
                                                echo 
"$valeurA est plus petit que $valeurB"// pas forcément
                                        
}
                        }

                if(
$signe == "!=" or "=!")
                        {
                                if(
$valeurA != $valeurB)
                                        {
                                                echo 
"$valeurA est différent de $valeurB";
                                        }
                                else
                                        {
                                                echo 
"$valeurA n'est pas différent de $valeurB";
                                        }
                        }
                if(
$signe == "<")
                        {
                                if(
$valeurA $valeurB)
                                        {
                                                echo 
"$valeurA est inférieur a $valeurB";
                                        }
                                else
                                        {
                                                echo 
"$valeurA n'est pas inférieur à $valeurB";
                                        }
                        }
        }
?>

j'ai comparé que deux variables c'est plus simple mais bon moins avancé que ton script Smile
+1 (1) -1 (0) Répondre
09-11-2014, 23h07
Message : #3
WizOut Hors ligne
Black Slave Coder
*



Messages : 111
Sujets : 13
Points: 14
Inscription : Apr 2012
RE: [PHP] Quel nombre est le plus proche ?
Ton code ne fait que questionner si une valeur est réellement plus grande, plus petite ou différente d'une autre, ce qui est inutile à mon gout il existe déjà la structure alternative if qui permet de faire ça directement, c'est rajouter une surcouche dans ton application pour rien, c'est comme lui mettre 2 kilos sur le dos, où bien c'est comme si que ovh utilisait du chauffage dans leur data-centre pour rendre la tâche plus difficile à leur serveur et provoquer un incendie, combattre le mal par le mal, ça n'a pas de sens.
"Il existe deux choses infinies : l'univers et la bêtise humaine" Einstein.
PHP/MySQL (POO & PDO) : OK
HTML5/CSS3 : OK
JAVA : En cours
+1 (0) -1 (0) Répondre
09-11-2014, 23h15
Message : #4
cacaphonie Hors ligne
Newbie
*



Messages : 12
Sujets : 3
Points: 11
Inscription : Oct 2014
RE: [PHP] Quel nombre est le plus proche ?
ENfaite je me focalisais plus sur les arguments de la fonction que le contenu d'elle, et je me suis perdu comme ça Smile
+1 (0) -1 (0) Répondre
09-11-2014, 23h57 (Modification du message : 09-11-2014, 23h57 par octarin.)
Message : #5
octarin Hors ligne
Apprenti sorcier
*



Messages : 68
Sujets : 11
Points: 47
Inscription : May 2013
RE: [PHP] Quel nombre est le plus proche ?
Et il se passe quoi quand $const = 2000 dans ton exemple ? Smile

Sinon voici ma solution en python:

Code PYTHON :

#!/usr/bin/env python3

def compare(signe, nb, tab, returnindice=False):
    try:
        if signe == '<':
            r = max(i for i in tab if i < nb)
        elif signe == '>':
            r = min(i for i in tab if i > nb)
    except ValueError:
        r = None        # If such value does'nt exists in tab

    if returnindice == True:
        return (r, [a for a, i in enumerate(tab) if i == r])
    else:
        return r

if __name__ == '__main__':
    tab = [5, 20, 125, 8, 9, 125, 1000, -5, -125]
    vtest = 80

    print(compare('<', vtest, tab, True))
    print(compare('>', vtest, tab, True))

 
Faire des mathématiques c’est donner le même nom à des choses différentes. -- Henri Poincaré
+1 (1) -1 (0) Répondre
10-11-2014, 00h13 (Modification du message : 10-11-2014, 14h22 par WizOut.)
Message : #6
WizOut Hors ligne
Black Slave Coder
*



Messages : 111
Sujets : 13
Points: 14
Inscription : Apr 2012
RE: [PHP] Quel nombre est le plus proche ?
Oui tu as raison je n'ai pas géré cette exception, mais je ne l'ai pas faite car j'en avais pas forcement besoin en fait ^^ $const était une valeur sûre. J'ai rectifié le tir, ça renverra NULL désormais en cas d'erreur Smile

PS : j'approuve le python c’est plus rapide
Par contre ton script ne retournera pas deux fois la même valeur (en cas de doublons, triplons, quadruplons etc...) si tu mets l'indice à False Wink
"Il existe deux choses infinies : l'univers et la bêtise humaine" Einstein.
PHP/MySQL (POO & PDO) : OK
HTML5/CSS3 : OK
JAVA : En cours
+1 (0) -1 (0) Répondre
11-11-2014, 11h36
Message : #7
octarin Hors ligne
Apprenti sorcier
*



Messages : 68
Sujets : 11
Points: 47
Inscription : May 2013
RE: [PHP] Quel nombre est le plus proche ?
Quel serait l'intérêt ?
Faire des mathématiques c’est donner le même nom à des choses différentes. -- Henri Poincaré
+1 (0) -1 (0) Répondre
12-11-2014, 11h48
Message : #8
Junky Hors ligne
Snorky Master
*



Messages : 228
Sujets : 35
Points: 203
Inscription : Mar 2013
RE: [PHP] Quel nombre est le plus proche ?
Bonjour,

Voici comment j'ai fais en python. (a rajouter un try except pour éviter les 'out of range' si le vtest n'a pas de supérieur ou d'inférieur)

Code PYTHON :

#!/usr/bin/env python

if __name__=="__main__":
    tab = [5, 20, 125, 8, 9, 125, 1000, -5, -125]
    vtest = 80
    tab.append(vtest)
    tab.sort()
    print "Inferieur le plus proche => ", tab[tab.index(vtest)-1]
    print "Superieur le plus proche => ", tab[tab.index(vtest)+1]
 


Output:
Code :
0 ✓ silentd@G3nt00 ~ $ ./tri.py
Inferieur le plus proche =>  20
Superieur le plus proche =>  125

En faite le déroulement est simple. On a un tab, on rajoute la valeur désiré au tab, on le tri et ensuite on affiche tab[index.valeur-1] pour inférieur et +1 pour supérieur.

Junky
Pour la sécurité, sous linux, le principal soucis est l'interface chaise/clavier

+1 (3) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut