il me semble que les valeurs représentent plutôt des intervalles, comme tu le présentes, il faudrait un tableau:
a : 0
b : 10 => intervalle de a
c : 30 (10+20) => intervalle de a + intervalle de b
d : 60 (10+20+30) => intervalle de a + intervalle de b + intervalle de c
Avec un parcours du tableau tant que la valeur est supérieure à la borne: on boucle.
A la sortie, le cas possible correspond à celui de la borne que tu viens de dépasser.
EDIT: petit script reprenant ce fonctionnement:
a : 0
b : 10 => intervalle de a
c : 30 (10+20) => intervalle de a + intervalle de b
d : 60 (10+20+30) => intervalle de a + intervalle de b + intervalle de c
Avec un parcours du tableau tant que la valeur est supérieure à la borne: on boucle.
A la sortie, le cas possible correspond à celui de la borne que tu viens de dépasser.
EDIT: petit script reprenant ce fonctionnement:
$cas=array('a','b','c','d');
$pond=array(40,20,30,10);
//Création du tableau de lecture; transformation des pondérations en borne max
$tab=array();
$nb=count($cas);
$borne=0;
for ($i=0;$i<$nb;$i++) {
$tab[]=array('borne' => $borne,'cas' =>$cas[$i]);
$borne+=$pond[$i];
}
$valeur=rand(1,100);
echo "valeur cherchée :".$valeur;
//Recherche du cas selon la valeur
$castrouve=$tab[$i]['cas'];
for ($i=0;$i<$nb;$i++) {
if ($valeur<$tab[$i]['borne']) { // < ou <= selon comment il faut considérer la borne
//sortir de la boucle
break;
}
$castrouve=$tab[$i]['cas'];
}
echo "cas trouvé :".$castrouve;