2017-04-26 13 views
0

配列内の値を検索したいですが、正確に検索された値が存在しません。 例:PHP配列を比較して検索

$array = array (
    "A" => 0, 
    "B" => 50, 
    "C" => 90, 
    "D" => 300, 
    "E" => 500 
); 

$searched_value = 80; 

この場合、Bを取得したいと思います。私が使用する 機能は以下の通りです:

array_search($searched_value,$array,"<=") 

どのように進めるべき?

+3

なぜB、なぜないC?何が基準です – mehulmpt

+2

このスレッドをチェックしてくださいhttp://stackoverflow.com/questions/5464919/php-nearest-values-from-an-array –

+0

これは_closest_ matchを探していないので、可能な重複の中で 'abs'アプローチ動作しないでしょう。 –

答えて

2

あなたの条件を満たす項目だけを含むように配列をフィルタリングします。

$target = 80; 

$filtered = array_filter($array, function($x) use ($target) { 
    return $x <= $target; 
}); 

既にソートされていない限り、ソートします。

sort($filtered); 

最大値< =検索対象が最後の要素になります。

$value = end($filtered); 
$key = key($filtered); 

だけarray_filterコールバックに代わり<=の演算子を使用し、最初値ではなく、最後のものを得るためにendの代わりにresetを使用し、代わりに>=ために、このアプローチを使用します。


array_filterは、それが基準を満たさない値を見つけるために始めても後にすべての要素を反復処理しますので、これは、すでにarray_filterを適用する前にソートされている大規模な配列のための理想的ではありません。その場合は、foreachを使用して、ターゲットを見つけるとすぐにループから抜け出すことができます。

$key = null; 
$value = 0; 

foreach ($array as $k => $v) { 
    if ($v > $target) { 
     break; 
    } 
    $key = $k; 
    $value = $v; 
} 

var_dump($key, $value); 

ソートされていない小規模の配列や配列の場合、これは大きな違いはありません。

-2

利用の場合: -

(array_search($ searched_value、$配列)== "")の場合 エコー "" が見つかりません。 else echo array_search($ searched_value、$ array);

0

array_mapを使用してすべての配列要素から値を減算し、(ゼロ)より大きい値をarray_filterでフィルタリングし、最後のエントリを取ることができます。それはあなたの価値でなければなりません。このような

何か:

$array = array (...); 
$searched_value = 80; 

function subtract($val) { 
    return $val - $searched_value; 
} 

function ltzero($val) { 
    return $val <= 0; 
} 

$new_arr = array_filter(array_map('subtract', $array), 'ltzero'); 

// get last item or $new_arr 
+0

@ Do not Panic:あなたの検索値よりも大きな値をフィルタリングするだけで、もっと簡単なバージョンです:) –