前提・実現したいこと
<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // この時点で、$arr は array(2, 4, 6, 8) となります // unset($value) しなければ、$value は今でも最後の要素 ($arr[3]) を指したままです foreach ($arr as $key => $value) { // $arr[3] が、$arr の各要素で上書きされて... echo "{$key} => {$value} "; print_r($arr); } // ...つまり、二番目から最後までの値が最後の値にコピーされていきます // 出力 // 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 ) // 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 ) // 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 ) // 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 ) ?>発生している問題・エラーメッセージ
foreach ($arr as $key => $value) {
// $arr[3] が、$arr の各要素で上書きされて...
echo "{$key} => {$value} ";
print_r($arr);
}
// ...つまり、二番目から最後までの値が最後の値にコピーされていきます
// 出力
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>
が解りません
該当のソースコード
// $arr[3] が、$arr の各要素で上書きされて...
と
// 出力
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
[3] => 2 )
[3] => 4 )
[3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
試したこと
何回も読んだけど理解不能です。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/07 04:34
2020/12/07 04:40
2020/12/07 04:43
2020/12/07 04:53
回答4件
0
自己解決
foreachで配列要素を書き換える。
ありがとうございます。
K_Y_Mさん
maisumakun
**************~~~~~質問~~~~~**************
<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // この時点で、$arr は array(2, 4, 6, 8) となります // unset($value) しなければ、$value は今でも最後の要素 ($arr[3]) を指したままです foreach ($arr as $key => $value) { // $arr[3] が、$arr の各要素で上書きされて... echo "{$key} => {$value} "; print_r($arr); } // ...つまり、二番目から最後までの値が最後の値にコピーされていきます // 出力 // 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 ) // 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 ) // 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 ) // 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 ) ?>**************~~~~~~~~~~**************
https://kinocolog.com/php_foreach_reference/
↓
「理解できない」と一言でいいましても
参照渡し自体が理解できていないのか、ループ処理自体が理解できていないのか
等がわかりません。
↓
URLの$value=1000が理解できた と仰っていますが。
ループ1回目は$value = 2となるため、$arr[3]が2
ループ2回目は$value = 4となるため、$arr[3]が4
ループ3回目は$value = 6となるため、$arr[3]が6
ループ4回目はループ3回目で$arr[3]が6となった為、$value = 6で、$arr[3]が6で出力される
が理解できない理由を教えて下さい。
↓
1度目のforeachを抜けた後も$valueは$arr[3]であり、
$valueに代入された値は$arr[3]にも反映されます。
ループ1回目は$arr[0]=2を$valueにセットする為
$value=2となり、$arr[3] = 2となるため、$arr全体は
[0] => 2, [1] => 4, [2] => 6, [3] => 2
となる。
ここまでで不明点はありますか?
↓
ループ4回目はループ3回目で$arr[3]が6となった為、$value = 6で、$arr[3]が6で出力される
ココが理解できていないです。
ループ4回目がなぜループ3回目で$arr[3]が6となった為、$value = 6で、$arr[3]が6で出力されるのですか。
↓
このような、「ループを回しながらそのループを書き換える」ような操作は、言語や環境によって動作が違ってくるものです(他の言語では「例外になって落ちる」という状況もありえます)。PHPの場合は「書き換わったものをそのまま採用する」という流れになっています。
↓
1度目のforeachを抜けた後も$valueは$arr[3]。
2度目のforeachの[3]は 各回ごとに1度目のforeachの$valueを参照していくので数字が変わっていく。
なぜ最後だけ6になるかと言うと、
3回目では[3] => 6と書き換わってしまっているのですね
完了です。
以下は私の理解出来ていない文を載せます
投稿2020/12/08 03:04
総合スコア4
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
******************----------**************************
<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } で&$value &が要素を直接書き換えるのは解ります。 この時点で、$arr は array(2, 4, 6, 8) となります。 も理解できているつもりです。 $arrが書き換わっているのは理解できますが $value は今でも最後の要素 ($arr[3]) を指したままです。とあるのですが $value は foreach ($arr as &$value) { $value = $value * 2; } $value の 最後の要素 ($arr[3])とありますが $arr は array(2, 4, 6, 8) $arr[3]は8になりますよね。 書き換えの前の $arr[3]は4になりますよね。 foreach ($arr as $key => $value) { // $arr[3] が、$arr の各要素で上書きされて... echo "{$key} => {$value} "; print_r($arr); } // $arr[3] が、$arr の各要素で上書きされて... も理解できていないのですが $arr[3] が、$arr の各要素で上書きされる動き?が解らないのです こんな感じで理解しているのです。 理由としたら // 0 => 2 Array ( [0] => 2, [1] => 2, [2] => 3, [3] => 4 ) // 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 3, [3] => 4 ) // 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 ) // 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 8 ) と考えていましたが 2目のforeach 文は $arrが 書き換わっているので // 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 ) // 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 ) // 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 ) // 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 ) ↑ $value は今でも最後の要素 ($arr[3]) を指したままです 2目のforeach 文は $arrが 書き換わっているので 8に書き換わっているはずが $value を 指しているので ここからどこの$valueを指しているのかよくわからないのですが foreach ($arr as $key => $value) の$valueと なると $arrの値になると8になりますし 順番に2→4→6と変動するならば 前のforeach ($arr as &$value) { $value = $value * 2; }なのかなと思います。 又 // 0 => 2 Array ( [0] => 2, [1] => 2, [2] => 3, [3] => 4 ) // 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 3, [3] => 4 ) // 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 ) // 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 8 ) 何故2と言うと 1回目は0=>1の 1×2=2 で値が2になる 2回目は1=>2の 2×2=4 で値が4になる 3回目は2=>3の 2×3=6 で値が6になる ここから理解できなくなってきます投稿2020/12/07 06:00
総合スコア4
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/07 06:13 編集
2020/12/07 06:03 編集
2020/12/07 06:11
2020/12/07 06:19
2020/12/07 06:24
2020/12/07 06:26
2020/12/07 06:27
0
参照渡しを理解されていないかと思われます。
foreach ($arr as &$value)
の”&”の部分です。
以下のURLを参考にされると、解説と皆さんの仰っている内容が理解できると思います。
https://kinocolog.com/php_foreach_reference/
投稿2020/12/07 04:52
編集2020/12/07 04:54総合スコア100
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/07 05:00
2020/12/07 05:02
2020/12/07 05:04
2020/12/07 05:06
2020/12/07 05:06
2020/12/07 05:07
2020/12/07 05:07
2020/12/07 05:51 編集
2020/12/07 05:12
2020/12/07 05:15 編集
2020/12/07 05:20 編集
2020/12/07 05:20
2020/12/07 05:20
2020/12/07 05:51 編集
2020/12/07 06:25
2020/12/07 06:29
2020/12/07 06:31
2020/12/07 06:32
2020/12/07 06:34
2020/12/07 06:37
2020/12/07 06:39
2020/12/07 06:40
2020/12/07 06:43 編集
2020/12/07 06:42
2020/12/07 06:58
2020/12/07 07:02
2020/12/07 07:09
2020/12/07 07:10 編集
2020/12/07 07:11
2020/12/07 07:16
0
参照が残っていると、$value
への代入が、そのまま$arr[3]
への代入となります。
なので、ループ1回目では$value = 2
となるため、$arr[3]
も2となります。
投稿2020/12/07 04:43
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/07 04:44
2020/12/07 04:49
2020/12/07 04:53
2020/12/07 05:07
2020/12/07 05:10
2020/12/07 05:11 編集
2020/12/07 05:18
2020/12/07 06:02
2020/12/07 06:07
2020/12/07 06:19
2020/12/07 06:23
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。