たぶん私は間違っているが、あなたの質問の最初の部分から、私はあなたが/前または次のキーを取得する必要はありませんだと思うようなブロックを印刷します配列の項目。私はあなたには、いくつかの間隔があり、$variable
の値が含まれているどのような間隔を知っているし、それぞれに異なる値を印刷したいようだ
間隔。
このための最も簡単な解決策は、カスケード接続if
文のセットを使用することです:
if ($variable < 2) { // $variable < 2
echo('N/A');
} elseif ($variable < 3) { // 2 <= $variable < 3
echo(10);
} elseif ($variable < 4) { // 3 <= $variable < 4
echo(14);
} elseif ($variable < 5) { // 4 <= $variable < 5
echo(15);
} elseif ($variable < 8) { // 5 <= $variable < 8
echo(16);
} elseif ($variable < 14) { // 8 <= $variable < 14
echo(17);
} elseif ($variable < 51) { // 14 <= $variable < 51
echo(18);
} elseif ($variable < 94) { // 51 <= $variable < 94
echo(19);
} else { // 94 <= $variable
echo(20);
}
この戦略はうまく動作しますが、読みやすく、理解しやすいです。
ただし、コードの書き込み時に範囲のリスト(およびその値)がわからない場合(たとえば、データベースからロードされた場合)は、機能しません。
このような状況では、単純なforeach
ループを使用してリストを反復して正しい範囲を特定できます。
function getValue($input)
{
$limits = array(
2 => 10,
3 => 14,
4 => 15,
5 => 16,
8 => 17,
14 => 18,
51 => 19,
94 => 20,
);
foreach (array_reverse($limits, TRUE) as $key => $value) {
if ($key <= $input) {
return $value;
}
}
return 'N/A';
}
echo(getValue(2)); # 10
echo(getValue(6)); # 16
echo(getValue(25)); # 18
echo(getValue(51)); # 19
echo(getValue(100)); # 20
関数は、逆の順序で要素を含む配列を返します。 2番目の引数としてTRUE
を渡すと、元の配列のキー/値の関連付けが保持されます。
foreach
ループは入力値と配列のキーを逆順に比較します。入力値より小さいキーが見つかると、それはより低い範囲の範囲になり、関連する値が返されます。
入力値が配列のいずれのキーよりも小さい場合は$variable < 2
を意味し、N/A
を返します。このケースは質問に記載されていないためです。
このコードを何度も実行する必要がある場合や、範囲のリストが大きい場合は、境界のリストを降順で並べ替えてarray_reverse()
(代わりに$bounds
を使用)の呼び出しを削除する方が良いです。
配列の値にprevとnextのノードを格納することができます。 – muasif80
'array(key => array(value、prev、next));' – muasif80
のように可能です[https://stackoverflow.com/questions/2593802/php-arrays-next-and-prev) – Ice76