元ニート中卒派遣30代ブサメン童貞のブログ

みんなが存在に疑問を感じている「元ニート、中卒、派遣、30歳超えのブサメン童貞」が実際に生息し、そして「どうやって生きてるか」を晒していくブログ

ユーザ定義関数を書く

htmlspecialchars()ってさ、長いし面倒だよね。むしろENT_QUOTESって覚える気なくすよね」というただそれだけの理由で(長いと間違いやすくて、エラーの原因にもなるっていうサジェスト無視の男気な理由もあるけど)ユーザ定義関数の練習編的な扱いをされているhtmlspecialchars()ですが、事なかれ主義を貫く僕としても練習しないわけにはいきません。

htmlspecialcharsさん、いつもの頼むよ

えっちぃのは嫌いです。まあ、そう言わずに。

<?php
function h($str) {
  return htmlspecialchars($str, ENT_QUOTES, "utf-8");
}

このreturnの概念、慣れていないと微妙にしっくりきませんが、要するに「次からh($str)と書けば、この$strに入ってくるのはhtmlspecialchars()されて返ってきたもの」ということになります、たぶん。functionでユーザ定義関数を作るときは、慣れるまで「いつも思考停止状態でなんとなく使っているあの関数は、実際どうやって動いているんだろう」ということを考えないと混乱します。

応用編

このhtmlspecialchars()ですが、残念なことに配列にはまるっと適用することができません。そこでまたも現れた天才、htmlspecialchars関数を簡単に扱えるようにするを参考に以下のように書き換えてみます。

<?php
function h($str) {
  if (is_array($str)) {
    return array_map("h", $str);
  } else {
    return htmlspecialchars($str, ENT_QUOTES, "utf-8");
  }
}

is_array()はもうおなじみの変数が配列かどうかのチェック。問題はarray_map()です。とりあえず珍しくオフィシャルマニュアル大人しく目を見開いて見る(韻踏合組合)。

array array_map ( callable $callback , array $array1 [, array $... ] ) array_map() は、array1 の各要素に callback 関数を適用した後、 そのすべての要素を含む配列を返します。

PHP: array_map - Manual

なんだかよくわかりませんが、上記のコードに置き換えて説明し直すと「配列$strの要素ひとつひとつに、関数h()を実行して再び配列で返してくれる」ということになります、たぶん。考えた人、天才かよ。爪の垢を煎じて飲ませてください、何でもしますから!

あとは、HTML部分のPHPを書き換えて終了です。パパパっとやって、終わりっ!

<section>
  <article>
    <h1>入力した文章</h1>
    <p><?php echo h($postdata['sentence']); ?></p>
  </article>
  <article>
    <h1>解析された文章</h1>
    <p><?php
    if (isset($res_json['word_list'])) {
      foreach ((array)$res_json['word_list'] as $key1 => $value1) {
        foreach ($value1 as $key2 => $value2) {
          $value = implode(":", $value2);
          echo " [" .h($value) ."] <br>";
        }
      }
    }
    ?></p>
  </article>
</section>
広告を非表示にする