2011-07-19 11 views
12

多次元配列の値を変更していて、それを横断するために使用されているforeachループの外にとどまっていません。PHP:foreachループの後に配列値を置き換えない

私の配列は、最初に次のようになります。

foreach ($people as $person){ 
echo $person['name'] 
.... 
logic for the visited variable 
... 
$person['visited'] = $calculated_visit_value; 
} 

を最後にI

print_r($person) 

(しかし、内部の)場合:

Array 
{ 
    [0] => Array 
    { 
    [name] => Bob 
    [age] => 33 
    [state] => CA 
    [visited] => 0 
    } 
    ... 
} 

私のPHPは行くことによって、それに入りましたforeachループのすべてがうまく見え、訪問先の値が設定されます。ただし、ループ外のI print_r($people)の場合は、$person['visited']は設定されません。私は何が間違っているのか分からない。

お手数ですが、

+2

あなたのforeachによって作られた配列のコピー(* $と* ...)それだ –

答えて

36

そのループの中から$personという名前の新しい変数を作成していて、配列にはその新しい変数のスコープが決して見えません。

あなたはそうのように、参照することによって、それを渡して試すことができます:

foreach ($people as &$person){ 
echo $person['name']; 
.... 
logic for the visited variable 
... 
$person['visited'] = $calculated_visit_value; 
} 
+2

うん編集します!ありがとうございました。私はそれを正しいと印を付けるのに7分待つ必要があるが、それは完全に働いた。 – mikepreble

+2

これは動作します。ところで、この回答はまだ受け入れられていません。 – Guus

+2

これは完全に機能し、正解とマークする必要があります。 – Joseph

0

$person配列はそう、その値がとにかく通過し、次の上に上書きされてしまう設定、各反復で生成されます。

でも、その配列はループ中にのみ存在します。ループの前に別の配列を作成し、ループ中に値を配列に配置する必要があります。

3

foreach's documentationから:

配列が参照されていない限り、foreachのは 指定された配列ではなく、配列自体のコピーで動作します。 foreachには配列ポインタに影響があります。 の間、またはリセットせずにforeachの後に配列ポインタに依存しないでください。これが何を意味するのか

は、あなたの$者変数が配列で、このコードの影響で、類似していたもののコピーが実際に(このコードは、多くのレベルでのみ、間違った理解のためのものであることに注意をあなたが考えていることです(現在)と正しく配列、see hereをループする次の()関数)リセットを()、を使用します

for ($i = 0; $i < count($people); $i++) { 
    $person = $people[$i]; 
    // code inside your foreach ... 
} 

ですから、$人の内容を変更する場合は、あなたが実際に内部で何を変更しないでください$ people配列

これを解決するには、参照されているforeach:

foreach ($people as &$person) { // note the & 
    $person = $calculated_visit_value; // $person is now a reference to the original value inside $people and thus this will work as intended 
} 

foreachループが終了したときに$人はまだ$人々の最後の要素への参照であることの終わりのようrefenceは、クリアされないことに注意してください。 参考情報がわからない場合は、the documentationを参照してください。

それとも元の配列にアクセスするためにキーを使用します。あなたの詳細については

foreach ($people as $person_index => $person) { 
    $people[$person_index] = $calculated_visit_value; 
} 

を、それはあなたが新しいを作成している」、と言われたように、次の2つ一緒に

foreach ($people as $person_index => &$person { ... 
0

を使用することができますあなたのループの中から$ personという変数があり、あなたの配列はその新しい変数のスコープを決して見ません。

私はこのソリューションは、より堅牢な見つける:

foreach ($people as $key => $person) 
{ 
    echo $person['name']; 

    //logic for the visited variable 

    $people[$key]['visited']=$calculated_visit_value; 
} 
関連する問題