2017-09-06 8 views
2

以下は、私がphp配列の前と次のキーを取得するには?

if (($variable >=2) && ($variable <3)) { echo '10'; } 

のタイプの条件はしかし、私は、配列の前および次の項目を再生する必要があり、これを作成する場合、作成する私の配列です。 この結果はどのように達成できますか?それは、配列のコピーで動作し、あなたが0,1,2,3の素敵なシーケンシャルなインデックスを持っていないので、あなたは、foreachの上の次の()とPREV()を使用することはできません

Array 
(
    [2] => 10 
    [3] => 14 
    [4] => 15 
    [5] => 16 
    [8] => 17 
    [14] => 18 
    [51] => 19 
    [94] => 20 
) 


    foreach($the_final_array as $key => $value){ 
echo $key; 
echo $value; 
echo $previous_key; 
echo $nect_key; 
} 
+0

配列の値にprevとnextのノードを格納することができます。 – muasif80

+0

'array(key => array(value、prev、next));' – muasif80

+0

のように可能です[https://stackoverflow.com/questions/2593802/php-arrays-next-and-prev) – Ice76

答えて

0

。 ..単純なキーの加減算はできませんが、カーソル位置を自分で管理することができます。

do/whileループを使用すると、手動でnext()を進め、逆方向に前進することができます。巻き戻しまたは先送りすると配列カーソルが壊れることがあります。

$array = array(2=>10, 3=>14, 4=>15, 5=>16, 8=>17, 14=>18); 

$value = current($array); 

do 
{ 

    echo 'current-key: ' . key($array) . PHP_EOL; 
    echo 'current-value: ' . $value . PHP_EOL; 

    // PREV 
    if(($prev = prev($array)) === false) 
    { 
    echo 'prev-key: N/A' . PHP_EOL; 
    echo 'prev-value: N/A' . PHP_EOL; 
    reset($array); // Restore cursor 
    } 
    else 
    { 
    echo 'prev-key: ' . key($array) . PHP_EOL; 
    echo 'prev-value: ' . $prev . PHP_EOL; 
    next($array); // Restore cursor 
    } 

    // NEXT 
    if(($next = next($array)) === false) 
    { 
    echo 'next-key: N/A' . PHP_EOL; 
    echo 'next-value: N/A' . PHP_EOL; 
    end($array); // Restore cursor 
    } 
    else 
    { 
    echo 'next-key: ' . key($array) . PHP_EOL; 
    echo 'next-value: ' . $next . PHP_EOL; 
    prev($array); // Restore cursor 
    } 

    echo PHP_EOL; 

} while($value = next($array)); 

これは、次の

// current-key: 2 
// current-value: 10 
// prev-key: N/A 
// prev-value: N/A 
// next-key: 3 
// next-value: 14 
// 
// current-key: 3 
// current-value: 14 
// prev-key: 2 
// prev-value: 10 
// next-key: 4 
// next-value: 15 
// 
// current-key: 4 
// current-value: 15 
// prev-key: 3 
// prev-value: 14 
// next-key: 5 
// next-value: 16 
0

たぶん私は間違っているが、あなたの質問の最初の部分から、私はあなたが/前または次のキーを取得する必要はありませんだと思うようなブロックを印刷します配列の項目。私はあなたには、いくつかの間隔があり、$variableの値が含まれているどのような間隔を知っているし、それぞれに異なる値を印刷したいようだ

if (($variable >=2) && ($variable <3)) { echo '10'; } 

のタイプで条件ならば作成したい

間隔。

このための最も簡単な解決策は、カスケード接続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を使用)の呼び出しを削除する方が良いです。

関連する問題