Considérant que le tableau d'entrée est trié dans l'ordre ascendant asort()
par exemple, vous serez beaucoup plus rapide à effectuer une recherche en utilisant un recherche dichotomique .
Voici une adaptation rapide et sale d'un code que j'utilise pour insérer un nouvel événement dans un fichier de type Iterable liste d'événements triés par objets DateTime
Ainsi, ce code renverra le point le plus proche à gauche (avant / plus petit).
Si vous souhaitez trouver le point mathématiquement le plus proche : pensez à comparer la distance entre la valeur recherchée et la valeur de retour et le point immédiatement à droite (suivant) de la valeur de retour (s'il existe).
function dichotomicSearch($search, $haystack, $position=false)
{
// Set a cursor between two values
if($position === false)
{ $position=(object) array(
'min' => 0,
'cur' => round(count($haystack)/2, 0, PHP_ROUND_HALF_ODD),
'max' => count($haystack)
);
}
// Return insertion point (to push using array_splice something at the right spot in a sorted array)
if(is_numeric($position)){return $position;}
// Return the index of the value when found
if($search == $haystack[$position->cur]){return $position->cur;}
// Searched value is smaller (go left)
if($search <= $haystack[$position->cur])
{
// Not found (closest value would be $position->min || $position->min+1)
if($position->cur == $position->min){return $position->min;}
// Resetting the interval from [min,max[ to [min,cur[
$position->max=$position->cur;
// Resetting cursor to the new middle of the interval
$position->cur=round($position->cur/2, 0, PHP_ROUND_HALF_DOWN);
return dichotomicSearch($search, $haystack, $position);
}
// Search value is greater (go right)
// Not found (closest value would be $position->max-1 || $position->max)
if($position->cur < $position->min or $position->cur >= $position->max){return $position->max;}
// Resetting the interval from [min,max[ to [cur,max[
$position->min = $position->cur;
// Resetting cursor to the new middle of the interval
$position->cur = $position->min + round(($position->max-$position->min)/2, 0, PHP_ROUND_HALF_UP);
if($position->cur >= $position->max){return $position->max;}
return dichotomicSearch($search, $haystack, $position);
}
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 ?
0 votes
@amosrivera En fait, ça l'est. Votre question doit être un question pour que la communauté fournisse des réponses. Nous ne pouvons pas répondre à une déclaration. Il s'agit du format auquel les messages sont censés et doivent se conformer sur Stack Overflow.
5 votes
La question "Comment puis-je trouver la valeur "la plus proche" d'une aiguille ?" n'est-elle pas une question ?
0 votes
@meagar ma faute, je vais devoir vérifier la méta.
2 votes
@FMaz Oui, mais j'ai édité cela pour vous quand aucun changement ne semblait se profiler.
0 votes
Vous ne voulez pas trouver des "aiguilles" (dans une botte de foin). Vous voulez, pour un nombre cible, trouver le nombre le plus proche dans un tableau.