質問するログイン新規登録
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

1回答

648閲覧

PHPのループ処理内での参照渡しの挙動を知りたい

fork_

総合スコア43

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2022/07/13 13:47

0

0

参照渡し、値渡しに知見のある方に質問です。
下記のようなコードを見たときに、
phpではオブジェクトは参照渡しがデフォルトなので、$array[] = clone $objectのような形で値渡ししてあげないと、期待値通りの挙動にならないことは理解しています。

処理の順番的に、

$object->name = 値 $object->price = 値

で、$objectが完成したタイミングで$arrayに代入しているので、cloneで値渡ししなくても $array には想定通りの値が入るのでは?と、ふと疑問に思いました。
基本的な参照渡し、値渡しの概念は理解できているのですが、ループ処理になったときに内部でどのような挙動が起きた結果、配列の最後の値しか反映されないのかが知りたいです。
こちらご存じの方いらっしゃいましたら、ご教示いただけますと幸いです。

php

1【期待値】 2array(3) { 3 [0]=> 4 object(stdClass)#2 (2) { 5 ["name"]=> 6 string(9) "アイス" 7 ["price"]=> 8 string(3) "100" 9 } 10 [1]=> 11 object(stdClass)#3 (2) { 12 ["name"]=> 13 string(12) "ジュース" 14 ["price"]=> 15 string(3) "150" 16 } 17 [2]=> 18 object(stdClass)#4 (2) { 19 ["name"]=> 20 string(9) "唐揚げ" 21 ["price"]=> 22 string(3) "400" 23 } 24}

php

1<?php 2 3$articles = [ 4 ['name' => 'アイス', 'price' => '100'], 5 ['name' => 'ジュース', 'price' => '150'], 6 ['name' => '唐揚げ', 'price' => '400'], 7]; 8 9$object = new stdClass(); 10 11$array = []; 12 13foreach ($articles as $article) { 14 $object->name = $article['name']; 15 $object->price = $article['price']; 16 $array[] = $object; 17} 18var_dump($array); 19exit; 20========================= 21array(3) { 22 [0]=> 23 object(stdClass)#1 (2) { 24 ["name"]=> 25 string(9) "唐揚げ" 26 ["price"]=> 27 string(3) "400" 28 } 29 [1]=> 30 object(stdClass)#1 (2) { 31 ["name"]=> 32 string(9) "唐揚げ" 33 ["price"]=> 34 string(3) "400" 35 } 36 [2]=> 37 object(stdClass)#1 (2) { 38 ["name"]=> 39 string(9) "唐揚げ" 40 ["price"]=> 41 string(3) "400" 42 } 43} 44=========================

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

$objectが完成したタイミングで$arrayに代入しているので

次のループで、その同じ$objectを書き換えてしまいます。

投稿2022/07/13 13:52

maisumakun

総合スコア146706

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fork_

2022/07/13 14:51 編集

なるほど... 1回目のループでは、 ``` $array = [ (object)['name' => 'アイス', 'price' => '100'], ]; ``` 2回目のループでは、 ``` $array = [ (object)['name' => 'ジュース', 'price' => '150'], --> 本来はアイス、100が入るはず (object)['name' => 'ジュース', 'price' => '150'], ]; ``` 3回目のループでは、 ``` $array = [ (object)['name' => '唐揚げ', 'price' => '400'], --> 本来はアイス、100が入るはず (object)['name' => '唐揚げ', 'price' => '400'], --> 本来はジュース、150が入るはず (object)['name' => '唐揚げ', 'price' => '400'], ]; ``` のような形で、参照渡しをしているのでどんどん上書きされていく、ということでしょうか??
maisumakun

2022/07/13 14:47

配列の3つは同じオブジェクトですので、1つ書き換えれば全部書き変わります。 (なお、「参照渡し」は関数呼び出しに使う語ですので、変数代入の場面にはあまり妥当ではありません)
fork_

2022/07/13 14:50

ありがとうございます!! とても理解が深まりました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問