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

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

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

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

Q&A

解決済

4回答

1165閲覧

PHPの関数でreturnさせるときに、値を追加していく方法

gankonako

総合スコア16

PHP

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

0グッド

0クリップ

投稿2019/01/14 17:30

###実現したいこと
お世話になります。PHP初心者です。

PHPの条件分岐で<p>値</p>を出力するとき、

いずれの分岐先でも<div class="animal"></div>を追加して、<p>値</p>を囲みたいです。

###ためしたコード
イメージとしてはこうです。

php

1function get_animal( $animal ){ 2 3 return '<div class="animal">'; 4 5 if ( $animal == 'dog' ) { 6 return += '<p>犬です。</p>'; 7 }elseif ( $animal == 'cat' ) { 8 return += '<p>猫です。</p>'; 9 } 10 11 return += '</div>'; 12 13} 14

仮に上の関数でecho get_animal( 'dog' );した場合に、下記の出力を実現させたいわけなんですが、このようなケースでは上のPHPはどのように書くべきなのでしょうか?

html

1<div class="animal"> 2<p>犬です。</p> 3</div>

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

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

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

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

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

guest

回答4

0

ベストアンサー

ケースバイケースではありますが、今回の例を見る限りでは

php

1<?php 2 3// HTMLエスケープ用関数(今回の文字列では問題ないが基本的に一貫して使うべき) 4function h($s) 5{ 6 return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); 7} 8 9// 動物のキーから日本語名を取得する関数(定義が無ければ「?」) 10function get_animal($animal) 11{ 12 static $animapMap = [ 13 'dog' => '犬', 14 'cat' => '猫', 15 ]; 16 return $animalMap[$animal] ?? '?'; 17}

として上の方またはHTMLを出す部分とは別のファイルで関数を定義し、HTML出力部分では

html

1<div class="animal"> 2 <p><?=h(get_animal($animal))?>です</p> 3</div>

と書くのが正解だと思います。基本的には関数でHTMLをリターンするのは避けたほうがいい設計ですね。
ちなみに <?= ... ?><?php echo ... ?> のシンタックスシュガーです。

そして、もしこの塊を再利用できるようにしたいのであれば、関数ではなくテンプレートファイルとして置くほうがいいと思います。例えば

php

1<?php 2 3// テンプレートファイルパス(の一部)とそれで使われている変数を渡してレンダリングする関数 4function template($template, array $variables = []) 5{ 6 (function () { 7 extract(func_get_arg(1)); 8 include(__DIR__ . '/templates/' . func_get_arg(0) . '.php'); 9 })($template, $variables); 10}

をどこかに定義しておき、HTML生成部分で

php

1<?php template('animal', ['animal' => 'dog']) ?> 2<?php template('animal', ['animal' => 'cat']) ?>

のように呼び出すイメージです。実際、Laravelなどのメジャーなフレームワークにも似たような設計が取り入れられています。

投稿2019/01/14 18:29

編集2019/01/14 18:38
mpyw

総合スコア5223

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

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

gankonako

2019/01/21 00:35

詳しくありがとうございました。それにHTMLエスケープ用関数は便利ですね。これから使うように心がけたいと思います。
guest

0

returnするとその場で処理が終わってしまうので、
処理に応じて変数に文字列を組み立てて最後にreturnする前に共通の文字列を連結してあげてください。

イメージとしては以下のような感じ

PHP

1 2function wrapText($text){ 3 4 if($text === "a"){ 5 $wrappedText = "given text is A"; 6 }else{ 7 $wrappedText = "given text is ".$text; 8 } 9 10 return "<p>".$wrappedText."</p>"; 11 12} 13

投稿2019/01/14 17:45

tanat

総合スコア18713

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

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

gankonako

2019/01/14 18:10

あなるほど、条件の中は「return」でなく「returnさせたい値を変数に入れる」んですね。ありがとうございます。
guest

0

mpywさんのがベストだと思いますが、
テンプレートが面倒ならこんなのも…

PHP

1<?php 2 3//ここも連想配列使えるならその方がいいです。 4function get_animal($animal) { 5 switch ($animal) { 6 case 'dog': $ret = '犬';break; 7 case 'cat': $ret = '猫';break; 8 default : $ret = '?'; 9 } 10 return $ret; 11} 12 13//HTMLの一部をを出力する 14function put_part($str) { 15?> 16<div class="animal"> 17<p><?=$str?>です。</p> 18</div> 19<?php 20} 21 22//HTML表示部分 23 24put_part(get_animal($animal)); 25 26?>

投稿2019/01/15 01:43

takasima20

総合スコア7458

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

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

mpyw

2019/01/15 03:20 編集

関数の中で ?> で閉じて最後に <? で再開するのは WordPress などでも見るやつですね!(一番良い書き方とは言えないけど…)
gankonako

2019/01/21 00:34

switchとcaseという使い方を初めてみました。ありがとうございます。勉強になりました!
guest

0

本来どう書くべきかというのはさておき、元のプログラムの間違いを正すと、

PHP

1function get_animal( $animal ){ 2 3 $r = '<div class="animal">'; 4 5 if ( $animal == 'dog' ) { 6 $r .= '<p>犬です。</p>'; 7 }elseif ( $animal == 'cat' ) { 8 $r .= '<p>猫です。</p>'; 9 } 10 11 $r .= '</div>'; 12 return $r; 13}

投稿2019/01/14 23:37

編集2019/01/15 01:47
otn

総合スコア84507

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

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

gankonako

2019/01/21 00:34

なるほどプラスではなくドットでしたか。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問