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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

1930閲覧

ファンクション(関数)の使い方 PHP

earnest_gay

総合スコア615

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2016/06/01 16:44

ファンクション(関数)の使い方について質問させてください。

//サンプルA <tr> <td>生年月日</td> <td> <select name="year"> <option name="1950" value="1950" >1950</option> </select> 年 </td> </tr>

1950年から現西暦までのドロップダウンリストを動的に作るには下記のようになります。

//サンプルB <select name="year"> <?php $now = date("Y"); for($i = 1950;$i <= $now;$i++) :?> <option value="<?php echo $i;?>"><?php echo $i;?></option> <?php endfor; ?> </select> 年

例えば、サンプルBのプログラムをfanction yearのように関数化しておいて、
サンプルAでyear()のように呼び出して1950年から現西暦までのドロップダウンリストを生成したいのです。

//サンプルA <tr> <td>生年月日</td> <td> ここにファンクション記述 </td> </tr>

下記の様に記述すれば実現できます。

//サンプルA <tr> <td>生年月日</td> <td> <select name="year"> <?php $now = date("Y"); for($i = 1950;$i <= $now;$i++) :?> <option value="<?php echo $i;?>"><?php echo $i;?></option> <?php endfor; ?> </select> 年 </td> </tr>

しかし、サンプルAのプログラム量を減らしたいのです。
サンプルAとサンプルBにはどう記述すればいいでしょうか?

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

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

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

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

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

guest

回答4

0

関数ではなく,テンプレートで読み込むようにするべきですね.

html

1<?php $now = idate('Y'); ?> 2<?php for ($i = 1950; $i <= $now; ++$i): ?> 3 <option value="<?=$i?>"><?=$i?></option> 4<?php endfor; ?>

こういうファイルをHTTP経由でアクセスできない場所に作成しておき,

html

1<tr> 2 <td>生年月日</td> 3 <td> 4 <select name="year"> 5 <?php include '/path/to/file.php' ?> 6 </select> 7 </td> 8</tr>

のように使うと綺麗にまとまるかと思います.実用性を考えた場合には

  • 呼び出し元からパラメータを渡せるようにする
  • 呼び出し元の変数テーブルを汚染しない

という工夫が必要だと思うので,テンプレート展開用の関数を作っておくといいです.

php

1function template($file, array $args = []) { 2 call_user_func(function () { 3 extract(func_get_arg(1)); 4 include func_get_arg(0); 5 }, $file, $args); 6}

html

1<?php for ($i = $from; $i <= $to; ++$i): ?> 2 <option value="<?=$i?>"><?=$i?></option> 3<?php endfor; ?>

html

1<tr> 2 <td>生年月日</td> 3 <td> 4 <select name="year"> 5 <?php template('/path/to/file.php', ['from' => 1970, 'to' => idate('Y')]) ?> 6 </select> 7 </td> 8</tr>

投稿2016/06/02 04:59

編集2016/06/02 05:06
mpyw

総合スコア5223

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

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

mpyw

2016/06/02 05:12

ちなみにこの方法であれば,あるテンプレートの中に別のテンプレートを埋め込むという「テンプレートのネスト」も簡単に書けます.
guest

0

ベストアンサー

実はHTMLと組み合わせる部分の関数化は中々にめんどくさい問題です。

どこかでロジックと表示が混ざってしまい、表示を変更したいだけなのにロジックを変更しなければならないというジレンマに陥るからです。

例えば、

PHP

1//サンプルB 2function getYearOptions(){ 3 $now = date("Y"); 4 for($i = 1950;$i <= $now;$i++){ 5 $options .= "<option value=".$i.">".$i."</option>"; 6 } 7 return $options; 8} 9 10//サンプルA 11 12<tr> 13 <td>生年月日</td> 14 <td> 15 <select name="year"> 16 <?php 17 echo getYearOptions(); 18 ?> 19 </select> 2021 </td> 22</tr>

の様にして、関数内でHTMLを組み立ててしまえばサンプルA側では呼び出して戻り値をechoすればOKです。
<select>も関数内で組み立ててしまってもいいでしょう。

ただ、この関数はselectBoxのoptionとしてしか使えないので、他の選択肢、例えばチェックボックスを作るという用途としては使えません。

逆に

PHP

1//サンプルB 2function getYearOptions(){ 3 $now = date("Y"); 4 for($i = 1950;$i <= $now;$i++){ 5 $options[] = $i; 6 } 7 return $options; 8} 9 10//サンプルA 11 12<tr> 13 <td>生年月日</td> 14 <td> 15 <select name="year"> 16 <?php 17 $options = getYearOptions(); 18 foreach($options as $val){ 19 echo "<option value=".$val.">".$val."</option>"; 20 } 21 ?> 22 </select> 2324 </td> 25</tr>

の様にすると、関数内ではあくまでデータを作るだけで、HTML側でそれをどう組み合わせるかはその都度組み立てればいいので、汎用性は高まりますが、今回の件だとサンプルA側は大してコードは減りません。

どちらが正しいという訳では無いので、そのアプリケーション毎にポリシーを決めて、どういった方法が向いているか考えて実装してみて下さい。

投稿2016/06/01 17:19

tanat

総合スコア18709

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

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

0

関数化するときは、その関数の呼び出し元が簡易に記述できること、再利用できること、念頭に作ると良いですよ。
以下に挙げる私のサンプルでは、引数でnameを渡して、使いまわしができるようにしています。

あと個人的な趣味の話ですが…
可読性が悪くなるので、極力HTML内にPHPのコードは書きたくないです。
printfを使ってるのは基本C言語プログラマなので単なる癖ですが、個人的にはどこに何を埋め込むのかがわかりやすくて良いと思ってます。
関数内はあくまでもPHPのコードと割り切ってヒアドキュメントは使いません(素のHTMLが混在するとわかりづらい)

HTML

1<tr> 2 <td>生年月日</td> 3 <td> 4 <? MakeYearListBox("year"); ?>年 5 </td> 6</tr> 78<? 9function MakeYearListBox($name) 10{ 11 $now = date("Y"); 12 printf('<select name="%s">\n', $name); 13 for($i = 1950; $i <= $now; $i++){ 14 printf('<option value="%d">%d</option>\n', $i, $i); 15 } 16 printf('</select>\n'); 17} 18?>

投稿2016/06/02 00:05

ttyp03

総合スコア16996

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

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

0

ループも関数の中に入れちゃえばAはシンプルになります。
ヒアドキュメントで書けば読みにくさもないでしょう。

php

1<?php 2 3function YearListBlock(){ 4 5 $now = date("Y"); 6 $html = ""; 7 8 for($i = 1950;$i <= $now;$i++){ 9 $html .= <<< EOD 10 <option value="{$i}">{$i}</option> 11 12EOD; 13 } 14 15echo $html; 16 17} 18 19?> 20 21<select name="year"> 22 <?php YearListBlock(); ?> 23</select> 24

投稿2016/06/01 17:18

oskbt

総合スコア1895

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問