質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

解決済

2回答

353閲覧

配列の参照についてです

newyee

総合スコア213

PHP

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

0グッド

0クリップ

投稿2019/04/04 04:33

編集2019/04/04 09:46

下記のコードにつきまして、お聞きしたいことがございます。

php

1<?php 2$ary = range(1, 5); 3foreach ($ary as &$a) { 4 $a = $a * 2; 5} 6var_dump($ary); //=> [2, 4, 6, 8, 10] 7 8// 許されるパターン (リファレンス不使用) 9$bry = range(1, 5); 10foreach ($bry as $i => $b) { 11 $bry[$i] = $b * 2; 12} 13var_dump($bry); //=> [2, 4, 6, 8, 10] 14$a = 100; 15var_dump($ary);

一番下の行のvar_dump($ary)を出力しますと、「array(5) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> int(8) [4]=> &int(100) }」このように表示されますが、キーが4の値が「&int(100)」この部分の、「&int」とはなんなのでしょうか?また、元々、10が格納されていた位置に「100」が格納される点も分かりません。ご教示頂けましたら、幸いです。
よろしくお願いします
コードの出典です。

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

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

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

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

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

m.ts10806

2019/04/04 07:25

自分のコードでなければ出展を明示する これは質問する上での基本です。(たぶん前も言ったような)
newyee

2019/04/04 07:47

勝手に出典を表示してよいものかどうか、という部分があるんですよね。 出典先への迷惑になる可能性もありますし、あえて控えている部分でもあります
m.ts10806

2019/04/04 07:49

あの記事がなんのために書かれたか100%理解してから質問してください。
newyee

2019/04/04 07:52

コードの意味を理解できなければ、100%理解することはできないと思い、質問させてもらいました
m.ts10806

2019/04/04 08:04

そうじゃないですよ。 よし、それならQiitaの存在意義の方にいきますか? それともteratailの「質問するときのヒント」の話でもしましょうか。 「どのページのどの部分が分からなかったか書きましょう」とありますね。 それに書籍のときにも言いましたが、不特定多数の誰かが見ることが前提で記事が書かれているわけです。記事の質が良ければ評価され、悪ければ指摘が入るかスルーされる。覚悟の上で書かれています。 それに、もし「迷惑がかかる」と気にするなら出典もとの記事のコードコピペそのままの時点でアウトです。Qiitaのphp関係の記事の中でも評価が高い記事のひとつです。探せばすぐ割れます。そのほうが失礼ですね。 それなら「この記事で分からないことが」と素直に書かれた方が印象が良くなります。 実際にそのように質問している方もいます。そのほうが答えやすくなります。 なぜなら、コードだけでなくコードの解説もあるから。その解説を理解できているかどうかで回答の方向性も定めやすいから。 何もなく単にコードだけで提示されて「分からん」では、「あんたが書いたコードじゃないのかよ」という印象が強くなります。自分の書いたコードを説明させるってなると、それはもう質問じゃなくなりますよね?
m.ts10806

2019/04/04 08:26

あと、100%理解したいならあの項目にリンクされてるphpマニュアルの解説の理解が先です。「もう少し詳しく」とそこだけにフォーカスされたリンクされた記事の理解が先です。その上であの記事の「参照をやめろ」が成り立ってるので。
newyee

2019/04/04 08:32 編集

例えばですけど、仕事なんかでプログラミングをしている人からしたら、欠点が多々あると思うコードでも、書籍なんかではあえて、初心者用に分かりやすく、書いてある場合もあります。しかし、本の出典を明かして質問してしまったら、実際はあえて分かりやすく説明されているものでも、この本のコードだめじゃないかと指摘が入り勘違いで評価が下がってしまうこともあるかと思います。
m.ts10806

2019/04/04 08:39 編集

それはあの記事を紹介した私や 記事を出典に質問する質問者、記事を回答の根拠にする回答者すべてへの宣戦布告ということでよろしいですかね。 teratailで推奨されていることをやらないのはそもそもマナー違反です。あなたの信念だけで成り立つものではないです。 それに、欠点が多々あるコードを紹介している記事や書籍はプログラミングをやっていく上では排除すべきです(エンジニアの共通認識)。欠点を学んでも大事故につながるだけ。初心者のためにもならない。 何度か回答でついたことないですか?「そのようなことが書いてある書籍は今すぐ廃盤にすべき」と言った旨や「読まないように広めないと」のような旨のコメント。 間違ったやり方で頑張っても間違ったやり方の天才になるだけです。 そのような人間は現場では使い物になりません。
newyee

2019/04/04 08:49

コードの内容なんかにも、よるのではないかと思います。あえて、初心者用に分かりやすく書いてあるコードと、書籍にも注意書きがされているようなものを、わざわざ晒す必要はないのではないかとも思います。 >>読まないように広めないと これが一番危ないと思います。書籍を持っている人が、書くのなら良いですが、そうでない人がコードだけみて、ダメなコードだと決めつけて叩く人も出てくるやもしれないと思います 学ぶにも段階がありますし、最初はあえて、初期段階で学ぶのに不要な部分を削るというのはあるかと思います。
m.ts10806

2019/04/04 08:53

>そうでない人がコードだけみて、ダメなコードだと決めつけて なら、コード以外も見てもらって正当な評価をしてもらわないと、ですね。ネットがつながれば誰でもみれる記事なのでURL出せば誰でも読めます。 今のこの質問はコードだけ見せてる状態ですよ。ご自身の信念がブレてます。
newyee

2019/04/04 08:59

どのコードを見て、疑問に思ったかは、実際分からないとも思います。もしかしたら、今回もqiitaの記事でない所からの引用かもしれないですしね。
m.ts10806

2019/04/04 09:10 編集

うだうだ言ってないで出典として記事リンクつけてもらえませんか?今回はそれだけで引くし、今後もそうしてもらえれば同じ指摘されなくて済むんですよ。 喧嘩したいんですか?ネットの記事で高評価800以上をもらうことがどれだけのことか分かってませんよね。 あなた「参考になった」って言ってたじゃないですか。それなら「自分が参考になったんだから自分のような初心者にも参考になるはずだ」ってなりませんか? プラス方向の拡散なら積極的にすべき。むしろ、この質問には出典がない方が不自然でマナー違反。 ちなみにteratailでは非推奨行為であるマルチポストもすぐバレます。そのまんまコードコピペしてて、評価されている記事が割れないはずがない(これ2回目です)
newyee

2019/04/04 09:23

あんまり、恫喝ともとれるような言い方は控えられた方が、良いと思いますけどね。
newyee

2019/04/04 09:24

>プラス方向の拡散なら積極的にすべき。 まぁそうですね。今回は、リンク張っておきます
m.ts10806

2019/04/04 09:26

「今回は」ではなく、自身が書いたコードではない場合は必ず出典を明記してください。teratailのルールです。
m.ts10806

2019/04/04 09:36

通報したいならどうぞ。その前に自身のこれまでを振り返った方が良いです。「俺ルール」押し通してるだけですよ。プログラミングにおいては大きな障害です。早急に改善されたし。
newyee

2019/04/04 09:39

出典を必ず明記しなければならないなんて書いていませんよ。
m.ts10806

2019/04/04 09:59 編集

同じことをまた書かせますか。指輪物語よりずいぶん短い文章ですよ。これくらい読んでください。 ネットで見つけた(今回はどちらかというと「紹介された」が正しいけど)コードで分からなかったことがあるんですよね?実際に動かしてもみたんですよね? https://teratail.com/help/question-tips#questionTips1-2 >検索して見つけたページでわからない事があれば、どのページのどの部分がわからないのかを明確に記し質問してみてください。 確かに「必ず」とは書いていません。そこはきちんと理解した私の表現の問題です。紛らわしくて失礼しました。 でも質問のしかたのルールですよね。 もしかしたそのページが嘘を書いているかもしれない。でもあなたはそれが判断できるだけの技術も知識も経験もありませんよね? 質問する側はそれも含めてアドバイスを求めましょうと言う意味です。 自身が書いていないことは明らかなのだから「それどこで見つけたの?」気になるのは当たり前です。 コードしかないならなおさら、解説も読んでアドバイスをする必要がありますよね? 出展なしでコードだけ、これは先の質問であった「仕様説明なしでコードだけ」と同じです。繋がりましたね。 これでも理解できなければ理解できるまで付き合うので、なんなりとどうぞ。
newyee

2019/04/04 10:06

なんだか、あなたのその攻め立てる物言いで言われると納得しかねる部分はあるんですよね... まぁ検索したページについては、記載もありましたし、出来るだけそうしていこうとは思いますが。
m.ts10806

2019/04/04 12:10

同じことを何度も言われてるからそう感じるのではないでしょうか。私は最初から何もぶれてませんしあくまで淡々とルール上で話をしているだけで責めているわけでもなんでもないです。 ネット上は誰が見てるかわかりません。常に誰かの目が光っていると言っても過言ではない。 teratailを例にすると非推奨の質問、間違った回答には容赦なく低評価がつく。逆にためになる質問、回答には高評価がつく。全世界からレビューをうけているわけです。 我々が知らないところで叩かれていることもあるでしょう。直接指摘をもらえるだけでありがたいこと。 私は回答しかしたことないですが、低評価をうけることもある、高評価をうけることもある。厳しすぎるがゆえに私怨で謎の低評価がつくこともある。 でも、その覚悟をもって回答なりコメントをしています。私怨でつくなら、私怨を見返すくらいの回答をしてやろうとか、私怨で低評価をしたことが恥ずかしく思わせるくらいの回答を心がけようとか。常日頃から自己研鑽です。 誰でも見れるネット上の記事、お金を出せば買える本、皆同じです。 誤った情報であれば淘汰されて当然のなかで相応の覚悟をもってやっています。 それでも間違いはあるもので、そこで評価機能、レビュー機能が生きてくるわけです。書籍もレビューやアンケートを元に再版が重ねられるわけですしね。 つまり、覚悟がないと見ず知らずの赤の他人にアドバイスなどできません。 言っておきますと、例え参考にした記事と提示した先が酷評されようと、提示した人が叩かれることはありません。酷評される記事を公開していることが問題。 Dead or Aliveです。 Deadになればそれだけの価値しかなかったと言うこと。Aliveになればそれだけ価値があるかレビューをうけて記事の質があがって残るべきと評価されたということ。 残酷ですが世の中そういうものです。
newyee

2019/04/04 12:28

私怨で低評価がついているというのは、はっきり言って思い上がりなのではないかと思います。客観的にみて、あなたの回答は低評価に値するということを受け止められてはいかがでしょうか。あなたは人には良く言っていますが、もっと周りの意見を受け止められたら良いかと思います。 間違った回答には、低評価がつくと自分でも言っておられますが、まさにその通りだと思います。
m.ts10806

2019/04/04 12:36 編集

あーそこは私にしか分からないので思い上がりとか、あなたに言われたくないですね。 低評価致し方ない回答があるのも確かですが、明らかに高評価が多い中でついている低評価は私怨です。まあそこだけ切り取られても「また点でしか捉えてないなぁ」と感じるばかりです。 これだけ覚悟覚悟と書いているのにそこ一切無視じゃないですか。 なんとかやり返せるところはないかと、汚い根性が見え隠れします。そんなの本来一切不要。本質から離れて目が濁るだけです。 >もっと周りの意見を受け止められたら良いかと これはそのままお返ししますね。結構「理解した」「感謝します」「参考になった」「~します」 言葉だけのことが非常に多いです。次にはすぐ破られていることもよくあります。同じこと何度も指摘されてませんか?私に限らず。それって「受け止めてる」と言えるんですか? 思い上がりもいい加減にしてください。
newyee

2019/04/04 12:46 編集

いや、誰がどう聞いたってそうですよ… 私怨で低評価がついているというのは、奢りが過ぎると思いますけどね… 絶対に自分が正しいと思い込んでいるみたいなので、何を言っても無駄かと思いますが…
m.ts10806

2019/04/04 12:49

(2回目)なんとかやり返せるところはないかと、汚い根性が見え隠れします。 そんなの本来一切不要。本質から離れて目が濁るだけです。 自分の都合の悪いところ、理解できていないところを全部スルーしてそのコメントしてますからね。 枝葉にしか目がいってないことにいい加減気づきましょうよ。 それとも、わざとやって浪費させようとしていますか? 理解できなければ理解できるまで付き合うので、なんなりとどうぞ。 ↑って書いたんですが。今更理解できないことが恥ずかしいこともなにもないでしょう。
newyee

2019/04/04 12:54

>なんとかやり返せるところはないかと あの・・・なんで自分の時はそういう考えになるんでしょうかね? ただ、僕は事実を述べているだけですよ。あなたが、思った事を直接言ってくるので、僕もそうしているまでです。
m.ts10806

2019/04/04 12:56

どういう電波を受信したらそういう考えに至るのかロジックを教えてください。 自身も客観的に見た上でそれを言えてるならなぜ枝葉ばかりにいくのですか? 本質とらえてまっすぐ進めば何日も前に終わっていたことをいつまで続けるつもりですか?
m.ts10806

2019/04/04 13:00

気づきませんか?「理解できなければ理解できるまで付き合うので、なんなりとどうぞ。 」 私は何度も書いているにも関わらず揚げ足取ろうと必死じゃないですか。楽しいですか?それって誰のためになるんですか? 自分の成長の糧にしたければ「理解できるまで付き合うので」に乗ればいいところをあなたは何をしたいんですか?よーく振り返ってみるといいです。ここ数日だけでも。
newyee

2019/04/04 13:13

>理解できなければ理解できるまで付き合うので、なんなりとどうぞ。 その割には、質問すると、やけに攻め立てますよね...そんな人には、質問しようとする気は失せますよ...
newyee

2019/04/04 13:14

逆にこちらの気持ちを考えてください
m.ts10806

2019/04/04 13:40 編集

おっと枝葉はそこまでだ。誰もうれしくないぞー、自分のためにもならないぞー。その前に自分を省みようねー。 ルールもマナーもぶっちぎってくる人が指摘にまみれるのは当然ですよ。 >その割には、質問すると、やけに攻め立てますよね まずはまともに質問してから言おう。勝手なイメージで語っちゃいかんぞー。 今回どこに質問があるんでしょう。揚げ足とることに必死で忘れてますね。質問すること。
newyee

2019/04/04 20:19

そっくりそのまま、お返しします
m.ts10806

2019/04/04 23:52 編集

私は質問する立場ではないですよ。今のところ理解できてないのはあなたの枝葉にしか目がいかない態度くらいです。理解する気がないんだなと捉えます。 だって初心者ですよね?根をはやし、しっかり張ってこれから育つ幹に備えなきゃいけないのになにまだ生えてくるかどうかすら分からない枝葉を気にしてるんですか。 今回の質問は「使うな」という警告だから完全に枝葉の部分です。理解しようと思うのは決して悪いことではないが、気にする前にやることは幾らでもある。読んで「へぇーそうなのか」くらいにとどめて「読んで理解できるようになってから追求しよう」で良い部分です。
newyee

2019/04/04 23:52

自分の意見は、通したい。でも、人に意見されるのは嫌だ。はたから見ればそう見えます
newyee

2019/04/04 23:55

枝葉の部分をあなたが、気にしだしたんでしょうに...
m.ts10806

2019/04/04 23:58

そのロジックを説明してご覧なさいな。ご自身が枝葉でないという証拠も含めて誰でも納得できるように。 今回の質問そのものは枝葉ですよね。あなたのコメントは全て枝葉に対するコメントですよね。枝葉の意味も分かってないのに指摘しないでください。 根が何か幹が何かきちんと説明してみなさいな。
newyee

2019/04/05 00:03

「使うな」と警告した部分ですよね?そこに関しての、意見はもう伝えましたよ
m.ts10806

2019/04/05 00:08

それこそなんの話ですかね。コミュニケーション初心者は勘弁してくださいと言ったはずですが。 書いてあることそのままなのに、ここも噛み砕かなきゃダメ? 「 相手から枝葉を気にしたというロジックを、自分からではないと誰でも納得できるように説明しましょう。 そして根が何か幹が何か説明しましょう 」
newyee

2019/04/05 00:17

僕はただあなたが、言いだした分かりにくい例えを汲み取って返信しただけです。
newyee

2019/04/05 00:18

「使うな」と言う部分が、枝葉の部分だとおっしゃったので、そうかなと思っただけです
m.ts10806

2019/04/05 00:19

これ以上噛み砕けないので再掲。 相手から枝葉を気にしたというロジックを、自分からではないと誰でも納得できるように説明しましょう。 そして根が何か幹が何か説明しましょう
newyee

2019/04/05 00:22

その言葉をそのままお返しします。 分かりにくい説明を、汲み取ってこっちは返信したまでです
m.ts10806

2019/04/05 00:29

どこの何がわかりにくいのでしょうか?具体的に引用してください。 分かりにくいと思ってるのになぜ正しく汲み取ったと言えるのでしょうか。「ここは分かった。ここは分かりません」と聞けば確実に前に進んでいたことではないのでしょうか。 それとも「分かってない」ことすら分かってないから説明できないのでしょうか。
newyee

2019/04/05 00:41

あなたが言っている枝分かれとかその辺りです
m.ts10806

2019/04/05 00:49

再掲すら面倒なので「2019/04/05 09:41」のnewyeeさんのコメントのどこか明確かどうか、私の確認事項(2019/04/05 09:29および2019/04/05 09:36)にちゃんと答えらえているかどうか考えてからコメントしてください。
newyee

2019/04/05 00:51

あなたの抽象的な、枝分かれだとか、本質だとかは、使ったあなたにしかわかりません
m.ts10806

2019/04/05 00:57

「枝分かれ」という語句は私は一度も使ってません。分かってないのに要約しないこと。 つまり、最初から全て分かってないまま適当に感覚だけで発言していたわけですね? さすがに全て説明するのは無理です。全部読み直してきてくださいとしか言えません。 「本質」の意味すら分かってないようなのでまず辞書を引いてきてください。
newyee

2019/04/05 02:10

いや、だからあなたが作った例えなので、こうじゃないのかなと推測することしかできませんよ。
m.ts10806

2019/04/05 02:24 編集

どこの何が作った例えか引用してねって書いてるのに伝わってない?分かってないのに推測しなくていい。それは単なる憶測でトラブルのもと。あなたが分かってないところ、例えだと思ってる私のコメントをコピペしてくればいいだけ。 それに「本質」 調べた?
s8_chu

2019/04/05 02:25

ここは「質問への追記・修正、ベストアンサー選択の依頼」に関する投稿を行う場所です。
m.ts10806

2019/04/05 03:51 編集

そうですね。もともと私は質問に出典を追記してもらいたかったためのコメントをしてます(あと今後もそうしてもらいたいし、teratailの質問としてもそれが望ましいので) にしてもちょっと長くなりすぎましたね。失礼しました。
raccy

2019/04/05 13:33

> 出典を必ず明記しなければならないなんて書いていませんよ。 著作権法第四十八条に書いています。
guest

回答2

0

ベストアンサー

上の方のforeachでは、$aは各要素への参照として動いていきます。そして、その参照はループを抜けても最後の要素を指して有効なままとなります。

そのため、あとから$aに代入すれば配列の要素も変化しますし、配列の方も「参照アクセスされている」ことを示す&が残ったままとなります。

このようなトラブルを避けるには、foreachを抜けた後で、unset($a);として参照を潰しておきましょう。

投稿2019/04/04 04:41

maisumakun

総合スコア145183

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

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

newyee

2019/04/04 06:49

非常に分かりやすいご説明で理解できました。 最後の要素を指したままだったので、100を代入したら、配列の最後の要素が100に書き換わったのですね... ご回答ありがとうございました
guest

0

まず、PHPの場合

PHP

1$a = &$ary[4];

これが左辺($a)に対し($ary[4])への参照を代入する
というのは正しいけれど、言葉が足りていません。

正確には、右辺($ary[4])も参照に書き換え左辺に参照を代入する。
という事になります。参考

あたかも右辺を書き換えないような人畜無害そうな見た目をしつつ
右辺の書き換えをしてくる非常に危険な演算子になっています。


つまり
$ary[4]を参照に書き換えたのでvar_dumpでの表示が&int(100)になるわけです。
そしてunset($a);を用いる事で参照カウントを減らし参照から通常の値に戻せます。

投稿2019/04/04 05:30

編集2019/04/04 05:34
asm

総合スコア15147

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

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

newyee

2019/04/04 07:07

ご回答ありがとうございます。 >右辺($ary[4])も参照に書き換え左辺に参照を代入する こちらなのですが、$a = &$ary[3]として、var_dump($ary)としましたら、$ary[3]が&int(8)となっており、参照扱いになっていました。少し複雑に感じましたので、できるだけ、参照は使わないようにしたいと思います。
asm

2019/04/04 08:17

そういうことですね。 嬉しい場面というのは滅多にないですし使わないのが一番ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問