2012-12-02 16 views
6

見て、次のキーを取得する:私は取得する機能を探していたPHPのキー()のforeachループ奇妙な行動にOR foreachループで、この時

current key: a, next key: b 
current key: b, next key: c 
current key: c, next key: d 
current key: d, next key: e 
current key: e, next key: f 
current key: f, next key: a 

:OUTPUT

<?php 
    $array = array('a' => '…', 'b' => '…', 'c' => '…', 'd' => '…', 'e' => '…', 'f' => '…'); 
    foreach ($array as $key => $val){ 
     echo "current key: $key, next key: ".key(($array))."<br>"; 
    } 
?> 

をforeach-loop内の連想配列の次のキー。私はちょっと試して突然それが働いた。 (私の例で見ることができます)。

この作業はなぜ行われますか?それは理にかなっていますか? ...私にはない! これは私に説明できますか?

key(($array))の部分が原因ですが、その理由は何ですか?私はそれは間違いだった.. key($array)を書いたかったが、2つのラップブラケットを削除するのを忘れてしまった。 それは偶然だった!

なぜこのように動作しますか?それはいいけど... ...?

+3

興味深い。エラー報告をオンにすると、多くのエラーが発生します。余分な括弧は直接変数参照を破っています。 '$ a'は変数で、'($ a) 'は' $ a'の*値*になる式です。 'key'は、参照によって渡される変数を期待します。正確に 'キー'がそれと何をしているのか、それがどう振る舞うのかは分かりませんが、私は間違った定義されていない振る舞いのもとでファイルします。 – deceze

+1

whoa、これは意図された動作が素晴らしい場合。私はこのような何かを使用することができたことが何度もありました。 –

+0

でも何をお勧めしますか?私はそれをそのままにしますか? –

答えて

4

keyのPHPマニュアルによると、key()は、現在の配列位置のインデックス要素を返します。

keyで問題があまりありません。また、二重かっこでも問題はありません。 Keyは配列を参照で受け取るので、二重かっこはあまり効果がありません。

この現象はforeachから発生します。 foreachが配列を反復するとき、配列の内部のcurrentポインタの設定時に異なるバージョンのPHPが異なる動作をします(key()next()current()など)。

PHPの配列は、ほとんどの言語では配列と似ていません。それらは実際にオブジェクト(特に連想配列)です。リンクリストのようなものだと思ってください(リンクリストはではありませんが、説明のために私と一緒に行ってください) - 繰り返しを繰り返すときは、現在どこにいるのか、次にどこに行くのかを知る必要があります。明らかに、ここで何が起こっている

は最初のループのために、すぐにで$key$value変数を設定した後のあなたが実行しているものは何でもPHPのバージョンに、foreachnext要素に内部currentポインタを設定されていることですあなたのコード。

私は間違いなくではありません。は、この動作に依存します。これは、その後のPHPの更新でこのコードが壊れる可能性があるためです。この特定のバージョンのちょうど楽しみの偶然の一致です。 次のキーを使用する場合は、foreachループを置き換えてください。 next()のPHPマニュアルには良い例があります。また、prev()each()、および「参照」セクションの他の機能も確認してください。

+0

+100、間違いなく良い答えです。 –