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

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

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

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

Q&A

4回答

1793閲覧

phpで、関数を用いて離れたところでprint

KGN_digital

総合スコア7

PHP

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

0グッド

0クリップ

投稿2016/03/12 21:22

編集2022/01/12 10:55

いつもお世話になっております。

以下のようなソースを記述しました。

php

1a<br> 2<?php 3function a($moji){ 4print $moji; 5} 6?> 7<br> 8c<br> 9<?php 10$moji = "b"; 11a($moji); 12?>

「a<br>」と「<br> c<br>」の間に
phpのprint $moji が挟まっていて、
$moji == "b"が成り立つので、結果が

a
b
c

となることを期待したのですが、実際には

a

c
b

となってしまいました。htmlソースを確認したところ

html

1a<br> 2<br> 3c<br> 4b

となってしまっていました。
webも調べましたが、この問題を扱う記事がうまく見つかりませんでした。
原因と、できれば代替案や解決策をご教授願います。

よろしくお願いします。


追記

例えば以下のプログラムを用意します。

php

1<div id="aaa"> 2数字を並べてみた<br> 3<?php 4function a($m){ 5print $m; 6} 7?><br> 8ここまで 9</div> 10<div id="bbb"> 11<?php 12/* 13併設区域 14*/ 15for ($m=0;$m<=$_GET['n'];$m++){ 16a($m); 17flush(); 18} 19?> 20</div>

出力されるhtmlソースが以下のようになってしまいます。(urlパラメータn=7のとき)

html

1<div id="aaa"> 2数字を並べてみた<br> 3<br> 4ここまで 5</div> 6<div id="bbb"> 701234567</div>

出力させたいhtmlソースは以下の通り

html

1<div id="aaa"> 2数字を並べてみた<br> 301234567 4<br> 5ここまで 6</div> 7<div id="bbb"> 8</div>

確かに、関数を使わずに、aaaのdiv内でphpのプログラムを完結させてしまうことも可能ですが、
for文第二引数の条件式右辺である$_GET['n']を、
bbbのdiv内の「併設区域」内で極めて複雑に定義された$nという変数に置き換える必要があるとき、関数に頼らざるを得ず、困っております。

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

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

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

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

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

unau

2016/03/12 22:03

代替案や解決策を出すには、どういうことをやりたいのかがわからないといけませんが、それがちょっと見えていないので、詳しくお願いします。
unau

2016/03/13 08:46

追記部分、読みました。 PHP のコードと HTML の構造とを混同しているような印象を受けます。「div#bbb 内で定義された $n」というところがありますが、div#bbb は HTML の構造上の話であり、$n については PHP のコードの話です。$n の定義がなぜ div#bbb でないといけないと考えていらっしゃるのか、教えてください。
KGN_digital

2016/03/13 09:09

ありがとうございます。div bbbやdiv aaaは、phpコードの場所を示すための付箋として使いました。div aaaとbbb(最終的にはさらに複数の箇所)で、printしたい文字列があり、その各々に冗長なphp文をコピーするのもどうなのかと思い、また、共有する変数も存在するため、関数で処理したいのです。
guest

回答4

0

PHP は「<?php から ?> で括られた箇所」は 実行すべきコード と解釈され、その外側の「地の文」は、そのまま出力される文字列と解釈されます。実行すべきコードの中で文字列を出力したいときには、明示的に echoprint などの文字列を出力する命令を実行する必要があります。
ご提示されているコード中、function a() を定義している部分は 実行すべきコード 部分であり、この中で実際に文字列を出力しないと何も出力されません。ここでやっていることは、「文字列を渡したらその文字列を出力する」という関数を定義しているだけであって、実際に出力をしているわけではありません。
最後の <?php タグの中では、先に定義された関数 a() を実際に使っています。a() では文字列を出力する定義になっていますので、ここで実際に文字列が出力されます。

代替案や修正案については、やりたいことをもう少し説明していただかないと書けません。


追記します。

関数の「定義」とその「使用」は別物であり、たいていの場合は違う場所で行われます。「定義」しているところでは通常何の出力も行われません。関数は出力を伴うもの、伴わないものどちらもありますが、出力されるとしたら「使用」しているところです。
たとえば、次のようにすればいいと思いますが、これではやりたいことと違うでしょうか。

php

1<?php 2function a($m){ 3 print $m; 4} 5?> 6<div id="aaa"> 7数字を並べてみた<br> 8<?php 9for ($m=0;$m<=$_GET['n'];$m++){ 10 a($m); 11} 12?><br> 13ここまで 14</div>

投稿2016/03/12 22:01

編集2016/03/13 09:24
unau

総合スコア2468

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

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

0

[解説]
function a($m){}は、定義ところで実行されるわけではありません。
a($m);のように、呼び出したところで実行されます。
ここの理解を間違えないように注意が必要です。
初めのうちは「呼び出しの行に、定義した処理が展開される。」と考えるとわかりやすいかもしれません。

php

1<?php 2function a($m) { 3 print $m; 4} 5?> 6<div id="aaa"> 7<?php a(2); ?> 8</div> 9 10↓ これは、以下の記述と同等です。 11 12<div id="aaa"> 13<?php 14$m = 2; 15print $m; 16?> 17</div>

これをふまえた上で、質問者さんがやりたいのはこういうことでしょうか?

php

1<?php 2function a($m) { 3 print $m; 4} 5function a_range($_tmpN) { 6 for ($i=0; $i <= $_tmpN; $i++) { 7 a($i); 8 } 9} 10 11// 最初に複雑な処理を全て終わらせる。 12/* 13併設区域 にあった処理 14*/ 15$complexityN = 1 + 2; // ← 極めて複雑に計算された$n 16$complexityBBB = $complexityN + 2; // ← 極めて複雑に計算された、別の変数 17?> 18<div id="aaa"> 19数字を並べてみた<br> 20<?php a_range($complexityN); ?><br> 21ここまで 22</div> 23<div id="bbb"> 24<?php a_range($complexityBBB); ?><br> 25?> 26</div>

↓出力結果

<div id="aaa"> 数字を並べてみた<br> 0123<br> ここまで </div> <div id="bbb"> 012345<br> ?> </div>

投稿2016/03/24 04:35

rkojima

総合スコア421

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

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

0

バッファリングの影響で順番が入れ替わったように思います。
改行コードで書き出されるということです。
print $moji;の下に
flush();を入れて確かめてみてください。

投稿2016/03/13 01:06

YA-METAL

総合スコア42

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

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

0

関数を定義したあとの改行タグを取り除けば想定した結果になりませんか?

a<br>

<?php function a($moji){ print $moji; } ?>

c<br>

<?php $moji = "b"; a($moji); ?>

投稿2016/03/12 23:47

TOEICengineer

総合スコア36

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問