Afficher les nombres qui sont égales au ratio

Résolu/Fermé
Anonyme1234_7288 Messages postés 65 Date d'inscription samedi 14 mars 2020 Statut Membre Dernière intervention 8 avril 2021 - 15 mars 2020 à 00:47
Anonyme1234_7288 Messages postés 65 Date d'inscription samedi 14 mars 2020 Statut Membre Dernière intervention 8 avril 2021 - 17 mars 2020 à 00:33
Bonjour,

En ce moment, je travail sur un programme en PHP, ce dernier consiste à trouver parmi toute les possibilité possible, le ratio qui est le plus près du résultat déterminé par l'utilisateur. Mais mon problème est que je suis incapable d'afficher les nombres qui sont égales ou le plus près du résultat.

Il ce peut que mon message ne soit pas claire mais à travers mon code, vous pourrez trouver des commentaires vous spécifiant l'utilité de la variable ou d'une section de code.

Si vous commencez à chercher une solutions pour mon problème, faite moi en part et nous pourrons travailler en collaboration.

Merci d'avance.

P.S. : Si vous voulez changer quelques parties du code par des fonctions ou même remplacer des tableaux par des listes, vous pouvez le faire.

Voici mon code :

<?php
    //Début des tableaux utilisés pour calculer toute les possibilités de ratio possible
    $gear1 = [1, 2, 3];
    $gear2 = [1, 2, 3];
    $gear3 = [1, 2, 3];
    $gear4 = [1, 2, 3];
    //Fin des tableaux utilisés pour calculer toute les possibilités de ratio possible

    //Début de la variable logeant le résultat
    $result = /*Par exemple */0.41666666666666;
    //Fin de la variable logeant le résultat

    //Début des calculs des possibilités des ratios
    $calc1 = (current($gear1)/current($gear2))*(current($gear3)/current($gear4));
    echo $calc1;
    echo "\n";
    
    next($gear4);
    $calc2 = (current($gear1)/current($gear2))*(current($gear3)/current($gear4));
    echo $calc2;
    echo "\n";
    
    next($gear4);
    $calc3 = (current($gear1)/current($gear2))*(current($gear3)/current($gear4));
    echo $calc3;
    echo "\n";

    reset($gear4);
	next($gear3);
	$calca1 = (current($gear1)/current($gear2))*(current($gear3)/current($gear4));
    echo $calca1;
    echo "\n";

    next($gear4);
    $calca2 = (current($gear1)/current($gear2))*(current($gear3)/current($gear4));
    echo $calca2;
    echo "\n";
    
    next($gear4);
    $calca3 = (current($gear1)/current($gear2))*(current($gear3)/current($gear4));
    echo $calca3;
    echo "\n";

    reset($gear4);
	next($gear3);
	$calcb1 = (current($gear1)/current($gear2))*(current($gear3)/current($gear4));
    echo $calcb1;
    echo "\n";

    next($gear4);
    $calcb2 = (current($gear1)/current($gear2))*(current($gear3)/current($gear4));
    echo $calcb2;
    echo "\n";
    
    next($gear4);
    $calcb3 = (current($gear1)/current($gear2))*(current($gear3)/current($gear4));
    echo $calcb3;
    echo "\n"; 
    //Fin des calculs des possibilités des ratios  
    

    //Début des variables $calc qui sont logés dans le tableau tab()
    $tab = array();
    array_unshift($tab, $calc1, $calc2, $calc3, $calca1, $calca2, $calca3, $calcb1, $calcb2, $calcb3);
    //Fin des variables $calc qui sont logés dans le tableau tab()
   
    //Début de la mise en ordre croissant et du dédoublonnement des éléments du tableau tab()
    echo  "\n"."tab". "\n";
    print_r($tab);
    $tab2 = array_unique($tab);
    asort($tab2);
    echo  "\n"."tab2". "\n";
    print_r($tab2);
    //Fin de la mise en ordre croissant et du dédoublonnement des éléments du tableau tab()

    //Début des blocs de code servant à connaitre les nombres les plus proches (Si vous ne comprenez pas cette partie, je pourrai vous l'expliquer plus en détail)
    reset($tab2);
    next($tab2);
    echo current($tab2);
    echo "\n";
    $res1 = (current($tab2) - prev($tab2))/2;
    next($tab2);
    $res65 = current($tab2) - $res1;                 
    $res3 = (next($tab2) - prev($tab2))/2;
    $res4 = current($tab2) + $res3;
    echo "plus petit: ".$res65;
    echo"\n";
    echo "plus grand: ".$res4;
    echo "\n";
    echo "\n";
    
    next($tab2);
    echo current($tab2);
    echo "\n";
    $res1 = (current($tab2) - prev($tab2))/2;
    next($tab2);
    $res65 = current($tab2) - $res1;               
    $res3 = (next($tab2) - prev($tab2))/2;
    $res4 = current($tab2) + $res3;
    echo "plus petit: ".$res65;
    echo"\n";
    echo "plus grand: ".$res4;
    echo "\n";
    echo "\n";
    echo "\n";

    next($tab2);
    echo current($tab2);
    echo "\n";
    $res1 = (current($tab2) - prev($tab2))/2;
    next($tab2);
    $res65 = current($tab2) - $res1;             
    $res3 = (next($tab2) - prev($tab2))/2;
    $res4 = current($tab2) + $res3;
    echo "plus petit: ".$res65;
    echo"\n";
    echo "plus grand: ".$res4;
    echo "\n";
    echo "\n";
    echo "\n";

    next($tab2);
    echo current($tab2);
    echo "\n";
    $res1 = (current($tab2) - prev($tab2))/2;
    next($tab2);
    $res65 = current($tab2) - $res1;             
    $res3 = (next($tab2) - prev($tab2))/2;
    $res4 = current($tab2) + $res3;
    echo "plus petit: ".$res65;
    echo"\n";
    echo "plus grand: ".$res4;
    echo "\n";
    
    echo "\n";
    next($tab2);
    echo current($tab2);
    echo "\n";
    $res1 = (current($tab2) - prev($tab2))/2;
    next($tab2);
    $res65 = current($tab2) - $res1;                  
    $res3 = (next($tab2) - prev($tab2))/2;
    $res4 = current($tab2) + $res3;
    echo "plus petit: ".$res65;
    echo"\n";
    echo "plus grand: ".$res4;
    echo "\n";
   
    echo "\n";
    next($tab2);
    echo current($tab2);
    echo "\n";
    $res1 = (current($tab2) - prev($tab2))/2;
    next($tab2);
    $res65 = current($tab2) - $res1;                
    $res3 = (next($tab2) - prev($tab2))/2;
    $res4 = current($tab2) + $res3;
    echo "plus petit: ".$res65;
    echo"\n";
    echo "plus grand: ".$res4;
    echo "\n";
    //Fin des blocs de code servant à connaitre les nombres les plus proches
?>   

4 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
15 mars 2020 à 06:41
Bonjour,

Ceci correspondrai à tes besoins ?
<?php

//Fonctions
function getClosest($search, $arr) {
   $closest = null;
   foreach ($arr as $item) {
      if ($closest === null || abs($search - $closest) > abs($item - $search)) {
         $closest = $item;
      }
   }
   return $closest;
}

//Début des tableaux utilisés pour calculer toute les possibilités de ratio possible
$gear1 = [1, 2, 3];
$gear2 = [1, 2, 3];
$gear3 = [1, 2, 3];
$gear4 = [1, 2, 3];
	
$recherche = 0.41666666666666;

$resultats = array();
$debug = array();
foreach($gear4 as $k4=>$v4){
	foreach($gear3 as $k3=>$v3){
		foreach($gear2 as $k2=>$v2){
			foreach($gear1 as $k1=>$v1){
				$calc = ($v1/$v2)*($v3/$v4);
				$resultats [] = $calc;
				$debug[] = array('calc'=>$calc,'valeurs'=>array($v1,$v2,$v3,$v4));
				
			}
		}
	}
}	
sort($resultats);

$valPlusProche = getClosest($recherche,$resultats);
echo "<br> Valeur cherchée : " . $recherche;
echo "<br>Plus proche résultat : "  . $valPlusProche;

echo"<pre>";
print_r($debug);
echo"</pre>";

0
Anonyme1234_7288 Messages postés 65 Date d'inscription samedi 14 mars 2020 Statut Membre Dernière intervention 8 avril 2021
Modifié le 15 mars 2020 à 18:28
Bonjour,

Ceci répond exactement à mes besoins, par contre, dans mes tableaux $gear, je ne vais pas seulement avoir trois valeur, je vais en avoir 125, donc est-ce qu'il y a des modification à faire ou non? De plus, je sais qu'il y a une limite dans les tableaux en PHP, donc est-ce qu'il y aura un impact ou non?

Merci
0
Anonyme1234_7288 Messages postés 65 Date d'inscription samedi 14 mars 2020 Statut Membre Dernière intervention 8 avril 2021
15 mars 2020 à 18:30
Bonjour,

Ceci répond exactement à mes besoins, par contre, dans mes tableaux $gear, je ne vais pas seulement avoir trois valeur, je vais en avoir 125, donc est-ce qu'il y a des modification à faire ou non? De plus, je sais qu'il y a une limite dans les tableaux en PHP, donc est-ce qu'il y aura un impact ou non?


Merci
0
Anonyme1234_7288 Messages postés 65 Date d'inscription samedi 14 mars 2020 Statut Membre Dernière intervention 8 avril 2021
17 mars 2020 à 00:33
Quelqu'un pourrait m'aider?
Il me marque une erreur disant que le tableau $debug est trop chargé.

Voici mon nouveau code :

<?php
    
    //Début de la fonction pour trouver le ratio le plus proche
    function getClosest($search, $arr) {
        $closest = null;
        foreach ($arr as $item) {
            if ($closest === null || abs($search - $closest) > abs($item - $search)) {
                $closest = $item;
            }
        }
        return $closest;
    }
    //Fin de la fonction pour trouver le ratio le plus proche

    //Début des tableaux
    $gear1 = [20, 20, 22, 23, 24, 24, 25, 26, 26, 29, 29, 30, 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, 37, 39, 40, 41, 42, 43, 44, 45, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 53, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 65, 66, 67, 69, 70, 71, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 83, 85, 87, 89, 89, 90, 91, 92, 93, 93, 95, 97, 98, 99, 100, 101, 103, 103, 107, 109, 111, 113];
    $gear2 = [20, 20, 22, 23, 24, 24, 25, 26, 26, 29, 29, 30, 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, 37, 39, 40, 41, 42, 43, 44, 45, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 53, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 65, 66, 67, 69, 70, 71, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 83, 85, 87, 89, 89, 90, 91, 92, 93, 93, 95, 97, 98, 99, 100, 101, 103, 103, 107, 109, 111, 113];
    $gear3 = [20, 20, 22, 23, 24, 24, 25, 26, 26, 29, 29, 30, 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, 37, 39, 40, 41, 42, 43, 44, 45, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 53, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 65, 66, 67, 69, 70, 71, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 83, 85, 87, 89, 89, 90, 91, 92, 93, 93, 95, 97, 98, 99, 100, 101, 103, 103, 107, 109, 111, 113];
    $gear4 = [20, 20, 22, 23, 24, 24, 25, 26, 26, 29, 29, 30, 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, 37, 39, 40, 41, 42, 43, 44, 45, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 53, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 65, 66, 67, 69, 70, 71, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 83, 85, 87, 89, 89, 90, 91, 92, 93, 93, 95, 97, 98, 99, 100, 101, 103, 103, 107, 109, 111, 113];
    //Fin des tableaux

    //Début de la variable où est logé le nombre recherché
    $recherche = 0.44444444444444 ;
    //Fin de la variable où est logé le nombre recherché

    //Début des calculs des ratios
    $resultats = array();
    $debug = array();
    foreach($gear4 as $k4=>$v4){
        foreach($gear3 as $k3=>$v3){
            foreach($gear2 as $k2=>$v2){
                foreach($gear1 as $k1=>$v1){
                    $calc = ($v1/$v2)*($v3/$v4);
                    $resultats [] = $calc;                    
                    $debug[] = array('calc'=>$calc, 'valeurs'=>array($v1,$v2,$v3,$v4));                    
                }
            }
        }
    }	
    //Fin des calculs des ratios
    
    //Début affichage du nombre rechercher et du nombre le plus proche du nombre rechercher
    sort($resultats);
    $valPlusProche = getClosest($recherche,$resultats);
    echo "<br> Valeur cherchée : " . $recherche;
    echo "<br>Plus proche résultat : "  . $valPlusProche;
    //Fin affichage du nombre rechercher et du nombre le plus proche du nombre rechercher
    
    
    echo"<pre>";
    //Début affichage du tableau
    echo "\n";
    echo"</pre>";
    //Fin affichage du tableau
?>
0