2010-12-12 5 views
3

J'ai un tableau, par exemple (il peut être quelque chose, mais il est déjà commandé):php le plus proche nombre mineur dans le tableau

array(1,7, 12, 18, 25); 

Je dois trouver ce numéro est le plus proche de ce tableau.

Prendre le tableau ci-dessus:

$needle = 11; 

Le nombre dans le tableau que je veux récupérer est 7. Le nombre le plus proche de 11 devrait être 12, mais je ne veux pas le nombre le plus proche, je veux le nombre le plus proche mineur, si cela a un sens.

Un autre exemple:

  • Saisie 26 le numéro récupéré doit être 25
  • Saisie 1 le numéro récupéré doit être 1
  • Saisie 6 le numéro récupéré doit être 1
  • Saisie 7 l'extrait le numéro doit être 7
  • Saisie 16 le numéro récupéré doit être 12

J'ai trouvé une fonction agréable, mais il ne récupère que le nombre le plus proche, et non le nombre le plus proche mineur:

function closestnumber($number, $candidates) { 
for($i = 0; $i != sizeof($candidates); $i++) { 
    $results[$i][0] = abs($candidates[$i] - $number); 
    $results[$i][1] = $i; 
} 
sort($results); 
$end_result['closest'] = $candidates[$results[0][1]]; 
$end_result['difference'] = $results[0][0]; 
return $end_result; 
} 

$closest = closestnumber(8,array(1,7, 12, 18, 25)); 
echo "Closest: ".$closest['closest']."<br>"; 
echo "Difference: ".$closest['difference']; 

Merci à l'avance.

Répondre

2

Cela ressemble à des devoirs, mais je vais vous l'humour:

function closestnumber($number, $candidates) { 
    $last = null; 
    foreach ($candidates as $cand) { 
     if ($cand < $number) { 
      $last = $cand; 
     } else if ($cand == $number) { 
      return $number; 
     } else if ($cand > $number) { 
      return $last; 
     } 
    } 
    return $last; 
} 
+0

Bonne solution générale. '$ last = null' peut être un initialiseur plus approprié. '$ key' n'est pas utilisé ou nécessaire. Une recherche binaire pourrait être plus appropriée si le tableau est grand. – Matthew

+0

Notez que cela nécessite le tri des valeurs dans l'ordre croissant. – Gumbo

+0

Bons points, édités. @Gumbo: Il déclare que le tableau est déjà commandé. – Andre

1

candidats de test Seuls sont inférieures ou égales à votre numéro. Et si vous vous souvenez toujours de la meilleure solution, vous n'avez pas besoin de trier les solutions pour trouver le meilleur.

Donc, essayez ceci:

function closestnumber($number, $candidates) { 
    $best = null; 
    foreach ($candidates as $candidate) { 
     if ($candidate <= $number) { 
      if (is_null($best) || $diff > $number - $candidate) { 
       $diff = $number - $candidate; 
       $best = $candidate; 
      } 
     } 
    } 
    if (is_null($best)) { 
     return false; 
    } 
    return array('closest' => $best, 'difference' => $diff); 
} 
5
$myArray = array(1,7, 12, 18, 25); 
$needle = 11; 

$resultKey = array_search(max(array_intersect(array_values($myArray),range(0,$needle))),$myArray); 
$result = $myArray[$resultKey]; 

EDIT

Suppose valeurs de tableau seront toujours des nombres entiers positifs

Version simplifiée

$myArray = array(1,7, 12, 18, 25); 
$needle = 11; 

$result = max(array_intersect(array_values($myArray),range(0,$needle))); 
+0

vous pouvez supprimer 'array_search()' et la ligne '$ result' entièrement. – salathe

+0

@salathe - vrai, ma sur-complication. –

+0

@stereofrog - true, et l'utilisation de min ($ myArray) augmenterait également l'ensemble de tableaux valide pour inclure des entiers négatifs. –

Questions connexes