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

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

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

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

Q&A

解決済

7回答

729閲覧

PHPの文字列に変数を代入

panasus

総合スコア12

PHP

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

0グッド

0クリップ

投稿2017/09/29 10:12

編集2017/09/29 12:01

定型の文字列で後から定義される変数を展開させたいのですが、そういったことはできないのでしょうか?

以下aaa.phpの中身

PHP

1<?php 2$LONG_TEXT = "${company}株式会社 ${name}様\n あいうえお${x}かきくけこ${y}"; 3?>

以下bbb.phpの中身

PHP

1<?php 2require_once 'aaa.php'; 3 4$company = 'アップル'; 5$name = 'スティーブ'; 6$x = '◯◯◯'; 7$y = '×××'; 8 9echo $LONG_TEXT; 10?>

期待していたもの
"アップル株式会社 スティーブ様\n あいうえお◯◯◯かきくけこ×××"

実際に得られたもの
"株式会社 様\n あいうえおかきくけこ"

$company等の変数よりも後に $LONG_TEXT を書けば良いというのは分かります。
例では $LONG_TEXT 1つだけですが、こういった定型の文字列が複数あり、また頻繁に書き換えるため
メンテナンスしやすいように独立したファイルに書きたいのです。

文字列の書式を定義しておいて、後から変数を代入することはできないのでしょうか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/09/29 10:13

前株の会社としては許せないな
panasus

2017/09/29 10:52

前株の会社は$TEXT1、後株の会社には$TEXT2に変数を代入みたいなことをやりたいんです。
guest

回答7

0

関数にしてしまうと言うのはどうですか?

aaa.php

PHP

1<?php 2function long_text($company, $name, $x, $y) { 3 return "${company}株式会社 ${name}様\n あいうえお${x}かきくけこ${y}"; 4}

bbb.php

PHP

1<?php 2require_once 'aaa.php'; 3 4$company = 'アップル'; 5$name = 'スティーブ'; 6$x = '◯◯◯'; 7$y = '×××'; 8 9echo long_text($company, $name, $x, $y);

引数の順番では無く名前が重要である、そういった呼び出しが複数ある、と言うのであれば、配列で受け渡すようにすればいいかと思います。

aaa.php

PHP

1<?php 2function long_text($arr) { 3 return "$arr[company]株式会社 $arr[name]様\n あいうえお$arr[x]かきくけこ$arr[y]\n"; 4} 5 6function short_text($arr) { 7 return "$arr[name]様におかれましては以下略\n つまり$arr[z]です。\n"; 8}

bbb.php

PHP

1<?php 2require_once 'aaa2.php'; 3 4$arr = [ 5 'company' => 'アップル', 6 'name' => 'スティーブ', 7 'x' => '◯◯◯', 8 'y' => '×××', 9 'z' => '△△△', 10]; 11 12echo long_text($arr); 13echo short_text($arr);

より複雑に、無いとき時は自動生成されたり、まとめて行いたいとなると、ockeghemさんの回答のようにクラスでまとめた方が良いかもしれません。

投稿2017/09/29 13:12

raccy

総合スコア21735

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

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

panasus

2017/09/30 07:29

ありがとうございます。 関数の方が行数は短くできそうですね。
guest

0

sprintfで順番の指定もできますよ。

PHP

1$res = sprintf( '%3$s株式会社 %2$s様\n あいうえお%1$sかきくけこ%2$s' 2 , '[1]' 3 , '[2]' 4 , '[3]' 5); 6// [3]株式会社 [2]様\n あいうえお[1]かきくけこ[2]

【PHP関数講座:sprintf | そふぃのphp入門】
http://php-beginner.com/function/strings/sprintf.html

投稿2017/09/29 12:21

編集2017/09/29 12:22
kei344

総合スコア69400

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

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

panasus

2017/09/29 12:44

このやり方で運用乗り切れそうです! ありがとうございます!
guest

0

クラスにしたらどうでしょうか? セッター作ると長くなるのでpublicプロパティにしましたが、そのへんはお好みで。

PHP

1<?php 2 3class LongText { 4 public $company; 5 public $name; 6 public $x; 7 public $y; 8 public function getText() { 9 return "{$this->company}株式会社 {$this->name}様\n あいうえお{$this->x}かきくけこ{$this->y}"; 10 } 11} 12 13$t = new LongText(); 14$t->company = 'アップル'; 15$t->name = 'スティーブ'; 16$t->x = '◯◯◯'; 17$t->y = '×××'; 18 19echo $t->getText();

asahina1979さんが既に示唆されていますが、おそらくもっとも要望にかなうのはevalでしょうね。

PHP

1<?php 2$LONG_TEXT = 'return "${company}株式会社 ${name}様\n あいうえお${x}かきくけこ${y}";'; 3 4$company = 'アップル'; 5$name = 'スティーブ'; 6$x = '◯◯◯'; 7$y = '×××'; 8 9echo eval($LONG_TEXT);

ただ、evalは非常に危険な機能ですので、濫用は絶対に駄目です。非常手段として紹介しましたが、もっと安全な方法を使うべきかと思います。

警告
eval() は非常に危険な言語構造です。 というのも、任意の PHP コードを実行できてしまうからです。 これを使うことはおすすめしません。 いろいろ検討した結果どうしても使わざるを得なくなった場合は、細心の注意を払って使いましょう。 ユーザーから受け取ったデータをそのまま渡してはいけません。 渡す前に、適切な検証が必要です。
http://php.net/manual/ja/function.eval.php から引用

投稿2017/09/29 12:18

編集2017/09/29 12:37
ockeghem

総合スコア11701

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

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

panasus

2017/09/29 13:15 編集

ありがとうございます。 evalは元々やりたかったことに一番近い書き方です。 ただ、ご指摘の通りデータの流れを完全に把握して検証の処理も入れてっていうのは難しいのでevalはやめときます。 定型表示したいものが結構たくさんあるので、 変数が少なめのはsprintfで、変数が多いものはclass化して管理しようかと思います。
guest

0

ベストアンサー

ごくかんたんなもの(名前でなく、「何番目」で管理するしかない)で良ければ、sprintfを使うという手もあります(PHPリファレンス)。

php

1$LONG_TEXT = "%s株式会社 %s様\n あいうえお%sかきくけこ%s"; 2 3$replaced = sprintf($LONG_TEXT, $company, $name, $x, $y);

投稿2017/09/29 11:46

maisumakun

総合スコア145183

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

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

panasus

2017/09/29 12:09 編集

ありがとうございます。 %sの部分を特定の変数と結びつけることは難しいでしょうか… 例えば以下のように人名が最初に来るように$LONG_TEXTに変更があったとします。 "%s様 %s株式会社\n あいうえお%sかきくけこ%s"; このときソースコード中で$LONG_TEXTを使っている個所を全て探し出してsprintfの引数の順序を書き換えていくというのは現実的に厳しいです。
maisumakun

2017/09/29 12:19

順番を入れ替えるだけなら、「%1$s」のように指定できます(上のPHPマニュアルもご参照ください)。
panasus

2017/09/29 12:42

なるほど! 初めから「%1$s」という書き方をしておいて各変数との対応関係をコメントで書いておけば実用的に運用できそうです。 ありがとうございます! "%1$s株式会社 %2$s様\n あいうえお%3$sかきくけこ%4$s"; // %1$s => $company // %2$s => $name
退会済みユーザー

退会済みユーザー

2017/09/29 22:12

手段が目的と化し始めているのをそこはかとなく感じる…
guest

0

独自に実装しても良いですが、ご質問のような状況ではテンプレートエンジンを利用するとよいかと思います。
PHPではSmartyというライブラリが有名かと思います。
また、それをさらにシンプルにした下記のDivなども見てみてはいかがでしょうか。

Div
http://divengine.github.io/div/

投稿2017/09/29 11:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

panasus

2017/09/29 11:45

文字列に変数を後から代入というのは実現できそうです。 ただ、定型文1つにつき.tplを1ファイル作らないといけないのでやや大仰かなという気がします。 $PRICE_JP = "${price_jp}円"; $PRICE_US = "${price_us}ドル"; みたいな細かい定型表示も山ほどありまして、PHPの基本機能でもっとシンプルなものがあればうれしいです。
guest

0

順番の問題では?

PHP

1$company = 'アップル'; 2$name = 'スティーブ'; 3$x = '◯◯◯'; 4$y = '×××'; 5require_once 'aaa.php'; 6 7echo $LONG_TEXT;

投稿2017/09/29 10:25

yambejp

総合スコア114779

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

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

退会済みユーザー

退会済みユーザー

2017/09/29 10:28 編集

そういうコード書きたいっすか? サンプルコードが動きゃいいってもんじゃないよなぁ…
panasus

2017/09/29 11:03

順番の問題なのはもともと分かっています。 質問に書いたのはあくまでも例です。
guest

0

自分で定義したプレースホルダーを使うといいっすね。

投稿2017/09/29 10:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/09/29 10:32

まー、こんなのに遅延静的束縛とか使ったら、ただのアホだと思うんですよね。 だから、プレースホルダーで十分すね。
退会済みユーザー

退会済みユーザー

2017/09/29 10:33

↑知らけど。 予想。
panasus

2017/09/29 11:06

ありがとうございます。 プレースホルダ―について調べてみます。
退会済みユーザー

退会済みユーザー

2017/09/29 11:25

eval のやつを言うのかと期待してたのだが
panasus

2017/09/29 11:35

プレースホルダ―ってもしかしてSQLないと使えないですか?
ockeghem

2017/09/29 12:04

プレースホルダはSQLでおなじみですが、それと似た仕組みを自作すれば? という回答だと思います
panasus

2017/09/29 12:17

なるほど。 ということはPHPの基本機能ではそういうことはできないってことですかね…
退会済みユーザー

退会済みユーザー

2017/09/29 21:54

ockeghem さんは流石過ぎるな。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問