72 votes

Trouver une valeur correspondante ou la plus proche dans un tableau

Comment puis-je chercher et trouver, pour une valeur cible donnée, la valeur la plus proche dans un tableau ?

Disons que j'ai ce tableau exemplaire :

array(0, 5, 10, 11, 12, 20)

Par exemple, lorsque je cherche avec la valeur cible 0, la fonction renvoie 0 ; lorsque je cherche avec 3, elle renvoie 5 ; lorsque je cherche avec 14, elle renvoie 12.

2 votes

Je ne sais pas ce que vous voulez faire.

0 votes

Il n'existe pas de fonction intégrée pour ce faire. Vous devrez écrire la vôtre. Vous devriez également envisager de demander à un véritable question dans votre question ; qu'est-ce qui vous pose problème actuellement ?

4 votes

@meagar je pense que la déclaration est très claire, ayant à demandez à une question n'est pas une obligation, n'est-ce pas ?

0voto

Dharman Points 1540

Il s'agit de la même approche que La réponse de Mario mais j'utilise array_search() y min() au lieu de trier. Les performances sont les mêmes, il s'agit donc d'une question de préférence.

function findClosest(array $values, $match)
{
    $map = [];
    foreach ($values as $v) {
        $map[$v] = abs($match - $v);
    }
    return array_search(min($map), $map);
}

-1voto

Neal Points 68710

Essayez ceci : (cela n'a pas été testé)

function searchArray($needle, $haystack){
    $return = $haystack[0];
    $prevReturn = $return;
    foreach($haystack as $key=>$val){
         if($needle > $val) {
            $prevReturn = $return;
            $return = $val;
         }
         if($val >= $needle) {
            $prevReturn = $return;
            $return = $val;
            break;
         }
    }
    if((($return+$needle)/2) > (($prevReturn+$needle)/2)){
         //means that the needle is closer to $prevReturn
         return $prevReturn;
    }
    else return $return;
}

-1voto

Piyush Dholariya Points 1103

Le code donné peut être utilisé pour obtenir votre solution :

var counts = [4, 9, 15, 6, 2],
  goal = 5;

var closest = counts.reduce(function(prev, curr) {
  return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);
});

console.log(closest);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X