• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:定義済み関数)

定義済み関数によるタグ処理

このQ&Aのポイント
  • 定義済み関数を使用して、フォームから入力されたタグを処理する方法を知りたいです。
  • 現在のコードでは成功していますが、長いので定義済み関数とfor文で同じことをしたいです。
  • しかし、結合演算子の使用方法に関するエラーが発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

<?php // とりあえず質問文にある変数にタグ一覧を入力 $row = []; $row[2] = '#焼肉#すき焼き#しゃぶしゃぶ#牛丼#とんかつ'; // おそらく$filesが、テンプレートのテキストファイルと思うのでそれっぽいものを書いておく $files = <<<EOS <div class="tag-area"> タグ1 タグ2 タグ3 タグ4 タグ5 全てのタグ </div> EOS; // 実行テスト echo tag($files, $row[2]); /** * テンプレートにタグを挿入する * * @param string $template 置換処理を行いたいテンプレートHTML * @param string $tags #で区切られたタグの一行 * @return string 置換後のHTML */ function tag($template, $tags) { // タグを"#"で分解して配列を得る $split_tags = explode('#', $tags); $replacements = []; $tag_htmls = []; // いくつあるかわからない場合はforeachでループする foreach ($split_tags as $i => $tag) { if ($i === 0) { // 配列の0番目はスキップ continue; } // 「すべてのタグ」に置換するためのAタグを生成し配列に詰める // sprintfは、HTMLに変数を入力したい場合に使いやすいし、見やすいので使いやすいです。 $tag_htmls[] = sprintf('<li><a href="../article.php?tag=%s">%s</a></li>', $tag, $tag); // 「タグ1」などナンバリング用の代替文字列と置換するタグ文字列の組み合わせを配列に詰める $replacements["タグ{$i}"] = $tag; } // 「全てのタグ」はタグ文字列をul/liでリスト化し、なおかつAタグでリンクにする // タグ名を「全ての」に変更したのは他の文字列と被っていたので。 $replacements['全てのタグ'] = sprintf('<ul>%s</ul>', implode('', $tag_htmls)); // 文字列を連想配列で一気に置換し、文字列を返す。 // 基本的に関数内で直接echoするより文字列を返すようにしたほうが使いやすい return strtr($template, $replacements); }

dhtfyjh
質問者

お礼

ありがとうございます。 全部はわからなかったのですが、 おおよそ理解できたので、頑張ってみます。 ありがとうございました。

その他の回答 (3)

回答No.3

あ~理解した上の関数がtag()だったんですね。 なら、先ほどの$outをreturnにしてください。 それで、全部解決できますよ。 なお、$rowは、tagのパラメタに入れた方がいいかと思います。 関数内からグローバル参照は、どこで何してるか わかりにくくなり、面倒なことと、そもそも動かない可能性が増えます。 どうしても、tagで$rowをパラメタに渡したくない場合は https://www.php.net/manual/ja/language.variables.scope.php global $row; などで、スコープ変更をすることで動作はするでしょう。 ひとまずそれで、PHPとしては動作しますが、 HTML全体の階層がおかしいので、そこは、 別途直しておいてください。 tag()前後がli~/liなのに、 tag()内部で、li~/liも送り出している件や、 liの外でdivを使っているあたりも これら全部直せば、思った通りにはなるかと。

dhtfyjh
質問者

お礼

お礼が遅れて申し訳ございません。 ユーザー定義関数のついておおよそ理解できました。ありがとうございます。 まだ、よくわかってない部分もあるのでもう一度取り組んでみます。

回答No.2

で、解説。。 //タグが何個あるかわからないため結合演算子で終わりたいが、 ここ、結合で終わらせる意味はありません。 echoが標準出力に送られるので、ただ送り出しただけで、 元々結合されていると思ってOKです。 一度で、送り出したいのであれば、 $out=""; for( $i=0; $i<count($tag); $i++ ){ $out.='<li>'.'<a href="'.$tag[$i].'">'.$tag[$i].'</a>'.'</li>'; } などで、別に結合を行い、最後に echo $out; のみで済ませる手もあります。 次の問題の、tag()が何をしているのか、わからないので、 何ともですが、この書式では、返り値を見ているので、 function tag() { return("abc"); } で、大本の取り込み部に結合されますが、 読みやすさの関係で、 str_replaceには、変数を渡すようにして、 変数の宣言側で、タグなどを記載したほうが、 わかりやすくなると思いますよ。

dhtfyjh
質問者

お礼

ありがとうございます。なるほど。 一度に出力する方法もあるのですね。 定義済み関数および戻り値の理解がまだまだだったので勉強してきます。

回答No.1

エラーについてのみ回答しておきます。 echo '<li>'.'<a href="'.$tag[$i].'">'.$tag[$i].'</a>'.'</li>'.; 末尾の".;" -> ";"のみに変更 $files=str_replace("ページのお題",'<ul>'.'<li>'.'<img src="../'.$row[1].'">'.'</a>'.'</li>'. '<div class="article-tag">'. ' <li> '.tag()'</li>'.'</div>'.'</li>'. '<li>'.$row[3].'</li>'.'</ul>',$files); ~~~.tag().'~~~      ここにドット これだけで動きますが。 なぜ、ドットを省略したかったのですか?

関連するQ&A

専門家に質問してみよう