3

たとえば、配列があります(何でもかまいませんが、すでに注文されています):

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

その配列に最も近い数を見つける必要があります。

上記の配列を取る:

$needle = 11;

取得したい配列の番号は です7。に最も近い番号は で11ある必要がありますが12、最も近い番号は必要ありません。意味がある場合は、マイナーな最も近い番号が必要です。

別の例:

  • 26取得した番号を入力する必要があります25
  • 1取得した番号を入力する必要があります1
  • 6取得した番号を入力する必要があります1
  • 7取得した番号を入力する必要があります7
  • 16取得した番号を入力する必要があります12

素敵な関数を見つけましたが、最も近い番号のみを取得し、マイナーな最も近い番号は取得しません。

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'];

前もって感謝します。

4

3 に答える 3

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];

編集

配列値は常に正の整数であると仮定します

簡易版

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

$result = max(array_intersect(array_values($myArray),range(0,$needle))); 
于 2010-12-12T18:40:52.123 に答える
2

これは宿題のように見えますが、私はあなたをユーモアを交えます:

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;
}
于 2010-12-12T18:18:01.793 に答える
1

あなたの数以下の候補者のみをテストします。また、常に最適なソリューションだけを覚えている場合は、最適なソリューションを見つけるためにソリューションを並べ替える必要はありません。

だからこれを試してください:

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);
}
于 2010-12-12T18:36:51.090 に答える