2013-12-09 13 views
11

foreach()で次のキーと値のペアを取得する方法を探しています。例:PHP配列foreach()内の次のキー/値を取得

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); 

foreach($a AS $k => $v){ 

    if($nextval == $v && $nextnextval == $v){ 
     //staying put for next two legs 
    } 

} 
+0

働くかもしれないソリューションです。http://stackoverflow.com/a/5096852/1022697 – qwertynl

+0

私はそのためのカスタムイテレータを作成します。 –

答えて

8

次の値と次の値にはアクセスできません。あなたが似たような行うことができます

しかし:

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); 

$keys = array_keys($a); 
foreach(array_keys($keys) AS $k){ 
    $this_value = $a[$keys[$k]]; 
    $nextval = $a[$keys[$k+1]]; 
    $nextnextval = $a[$keys[$k+2]]; 

    if($nextval == $this_value && $nextnextval == $this_value){ 
     //staying put for next two legs 
    } 
} 
+0

私の質問に100%答えなかったのに私はこれを使ってしまった。 – danielb

-2

おかしいが、私は(年ポーズで)十年のためのPHPプログラミングんだけど、私はちょうど一週間前に一つずつ歩行機能を必要としていました。

ここには、next、prev、リセットなどがあります。「参照」も参照してください。また、この回答に記載されarray_keys()

0

は、CachingIteratorを見てくださいチェック:

Peek ahead when iterating an array in PHP

または使用array_keys()を例えば、同じ質問に対して投稿を別の答えであります

$keys = array_keys($array); 
for ($i = 0; $i < count($keys); $i++) { 
    $cur = $array[$keys[$i]]; 
    $next = $array[$keys[$i+1]]; 
} 
1

ここでそれを行うための一つの方法です:

while($current = current($a)) { 
    $next = next($a); 
    $nextnext = next($a); 

    // Comparison logic here 

    prev($a); // Because we moved the pointer ahead twice, lets back it up once 
} 

例:http://3v4l.org/IGCXW

(注)この方法で書かれたループがあなたの元の配列の最後の要素を検討することはありませんことを。これは修正することができますが、あなたの現在のロジックでは、最後のものと比較するための「より多くの」要素がないため、重要ではないようです。

1

私は複雑O(n)と解決策を見つけたし、後方と前方のアレイを介し求める必要はありません:

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); 

// initiate the iterator for "next_val": 
$nextIterator = new ArrayIterator($a); 
$nextIterator->rewind(); 
$nextIterator->next(); // put the initial pointer to 2nd position 

// initiaite another iterator for "next_next_val":  
$nextNextIterator = new ArrayIterator($a); 
$nextNextIterator->rewind(); 
$nextNextIterator->next(); 
$nextNextIterator->next(); // put the initial pointer to 3rd position 

foreach($a AS $k => $v){ 

    $next_val = $nextIterator->current(); 
    $next_next_val = $nextNextIterator->current(); 

    echo "Current: $v; next: $next_val; next_next: $next_next_val" . PHP_EOL; 

    $nextIterator->next(); 
    $nextNextIterator->next(); 
} 

はちょうどあなたが$next_val$next_next_valに中継することを計画している場合valid()をテストすることを忘れないでください。

0

ループ内に単に置くことはできません。カスタムイテレータを書くよりも簡単に何かをやろうと思っていると思います。重複したキーを持つエントリを無視するだけの場合は、最後のキーを追跡して現在のキーと比較します。ここで

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); 

// Prints LA NY FL 
$last_v = null; 
foreach ($a as $k => $v){ 
    if ($last_v == $v) { 
     /** 
     * Duplicate value, so skip it 
     */ 
     continue; 
    } 
    echo $v.' '; 
    $last_v = $v; 
} 
関連する問題