第4週


組み込み関数

関数とは?

何かしらの入力値(引数)を与えることによって、
あらかじめ決められた処理を行い、その結果(戻り値)を返す仕組み。

戻り値 = 関数名(引数, …)

組み込み関数

PHPが標準で提供する関数のことを
組み込み関数ビルドイン関数内部関数などという。

関数には以下のような種類がある

  • 組み込み関数
      ・コア拡張   コア組み込み(無効にすることはできない)
      ・ハンドル拡張 php.iniで設定可能
      ・PECL拡張   PECL(PHP Extension Community Library)で提供されるライブラリ
  • ユーザー定義関数

※関数の構文の見方

戻り値の型 関数名 ( 引数, …)

文字列関数

マルチバイト文字列関数の設定

文字列の長さを取得する関数

int strlen (string $str)
   与えられた文字列 $str のバイト数を返す

PHP Manual:count

int mb_strlen (string $str [, string $enc])
   与えられた文字列 $str の文字数を返す
   $encは使用するエンコーディング名
   省略時にはphp.iniのmbstring.internal_encodingパラメータ(内部文字エンコーディング)を使用

PHP Manual:mb_strlen


文字列を大文字⇔小文字で変換

string strtolower (string $str)
   与えられた文字列 $str を全て小文字から大文字に変換

PHP Manual:strtolower

string strtoupper (string $str)
   与えられた文字列 $str を全て大文字から小文字に変換

PHP Manual:strtopper

string ucfirst (string $str)
   与えられた文字列 $str の先頭がアルファベットであれば、その文字だけを大文字に変換

PHP Manual:ucfirst

string lcfirst (string $str)
   与えられた文字列 $str の先頭がアルファベットであれば、その先頭の文字だけを小文字に変換

PHP Manual:lcfirst

string ucwords (string $str)
   与えられた文字列 $str の単語の区切りを全て大文字に変換

PHP Manual:ucwords

string mb_strtolower (string $str [, string $enc])
   与えられたマルチバイト文字列 $str を全て小文字から大文字に変換
  $enc には使用する文字エンコーディングを指定する

PHP Manual:mb_strtolower

string mb_strtoupper (string $str [, string $enc])
   与えられたマルチバイト文字列 $str を全て大文字から小文字に変換
   $enc には使用する文字エンコーディングを指定する

PHP Manual:mb_strtoupper

部分文字列を取得

string substr (string $str, int $start [, int $len])
   与えられた文字列 $str から部分的な文字列を取り出す
   $start の位置(先頭の文字は「0」)から $len の数だけ文字を取り出す
   $start で指定した位置から文字列の末尾まで取り出す
   $start、$len に負の数を指定した場合は文字列の末尾からの文字数を表し、末尾は「-1」として数える

PHP Manual:substr

string mb_substr (string $str, int $start [, int $len [, string $enc]])
   与えられたマルチバイト文字列 $str から部分的な文字列を取り出す
   $enc には使用する文字エンコーディングを指定する

PHP Manual:mb_substr

部分文字列を置換

mixed str_replace (mixed $src, mixed $rep, mixed $str [, int $cnt])
   $str の中の $src を全て $rep に変換する
   $cnt には $str の中の置き換えられた箇所の個数を格納する
   また、$str、$src、$rep には、それぞれ配列を渡すことも可能

PHP Manual:str_replace

例.
サンプル1

文字を特定の区切り文字で分割

array explode (string $deli, string $str [, int $limit])
   $str を $deli で区切った配列を返す
   $limit に正の数が指定された場合、最大 $limit の要素が含まれ、その最後の要素には $str の残りの部分が全て含まれる
   また、$limit に負の数が指定された場合、最後の -$limit 個の要素を除く全ての構成要素が返される
   なお、「$limit = 0」の場合は、「$limit = 1」と同値とみなされる

PHP Manual:explode

例.
サンプル2

特定の文字位置を検索

int strpos (string $str, mixed $needle [, int $offset = 0])
   $str の中で、$needle が最初に現れた位置を数字で返す
   また $offset により、検索を開始する $str の文字を指定することが可能
   この場合でも、返される位置は $str の先頭からの相対位置となりる
   さらに、$needle が文字列でない場合は、それを整数に変換し、その番号に対応する文字として扱う
   $needle が見つからない場合、「FALSE」を返す

PHP Manual:strpos

例.
サンプル3

int strrpos (string $str, mixed $needle [, int $offset = 0])
   $str の中で、$needle が最後に現れた位置を数字で返す
   この場合、$needle は単一文字でなければならない
   仮に $needle に文字列が指定された場合、その文字列の最初の文字だけが使われる
   $needle が見つからない場合、「FALSE」を返す

PHP Manual:strrpos

int mb_strpos (string $str, mixed $needle [, int $offset = 0 [, string $enc]])
   マルチバイト文字列に正しくマッチするように、strpos関数を拡張したもの
   $enc には使用する文字エンコーディングを指定する

PHP Manual:mb_strpos

int mb_strrpos (string $str, mixed $needle [, int $offset = 0 [, string $enc]])
   マルチバイト文字列に正しくマッチするように、strrpos関数を拡張したもの
   $enc には使用する文字エンコーディングを指定する

PHP Manual:strrpos


文字列を整形

string sprintf (string $format [, mixed $args [, …]])
   $args で与えられた文字列を、$format で指定された文字列にして出力
   $froma tの部分以外は、そのまま

PHP Manual:sprintf

int printf (string $format [, mixed $args [, …]])
   $args で与えられた文字列を、$format で指定された文字列にして、その長さを出力

PHP Manual:printf

例.
サンプル4

文字列を変換

string mb_convert_kana (string $str [, string $option [, string $enc]])
   $str で与えられたマルチバイト文字をひらがなからカタカナ、全角文字から半角文字に変換可能
   エンドユーザーから入力した値に「ゆらぎ」があったとしても、この関数を使えば表記をそろえることができる

PHP Manual:mb_convert_kana

文字エンコーディングを変換

string mb_convert_encoding (string $str, string $to [, mixed $from])
   $strの文字エンコーディングを、$from から $to に変換
   $from には変換前の文字エンコーディング名を指定できるが、これは配列またはカンマ区切りの文字列とすることが可能
   $from を指定しなかった場合は、内部エンコーディングを使用
   なお、$from に「auto」と指定すると「ASCII,JIS,UTF-8,EUC-JP,SJIS」と展開される

PHP Manual:mb_convert_encoding

string mb_convert_variables (string $to, mixed $from, mixed &$vars [, …])
   エンコーディング $from の変数 $vars を $to に変換 
   成功時に変換後の文字エンコーディングを返し、失敗した場合には「FALSE」を返す 
   $from は省略できないので、内部エンコーディングを使用する場合には、
   $from = mb_internal_encoding();
   などとして、内部エンコーディングを明らかにしておく必要がある

PHP Manual:mb_convert_variables

電子メールを送信

bool mb_send_mail (string $to, string $subject, string $msg [, string $headers = null [, string $param = null]])

PHP Manual:mb_send_mail

配列で使う関数


配列の要素数を取得

int count (array $var [, int $mode = COUNT_NORMAL])
   $var に含まれるすべての要素またはプロパティの数を数える

PHP Manual:count

デフォルトでは、入れ子になった配列の要素は無視して、1次元目の要素だけで数える
しかし、引数の $mode をCOUNT_RECURSIVEにすると、2次元目以降に相当する要素もカウントし、
その合計数を返す

例.
サンプル5

配列の内容を連結

array array_merge (array $array1 [, array $array2 [, …]])
   前の配列の後ろに配列を追加することにより、ひとつまたは複数の配列の要素をマージし、得られた配列を返す

PHP Manual:array_merge

以前紹介した「+」演算子とは以下のような箇所が違う

  • 連想配列のキー」が重複している場合には、「後者」が優先される(上書き)
  • インデックス番号」が重複している場合には、新たなインデックス番号が振られるため、上書きされることはない

例.
サンプル6

配列の各要素を結合

string implode (string $glue, array $pieces)
   配列の各要素を $glue で連結した結果を返す
   デフォルトでは、$glue は空文字列

PHP Manual:implode

配列の先頭/末尾に、要素を追加/削除

int array_push (array &$array, mixed $var [, mixed $var …])
   $var で与えられた要素を $arrayの末尾に追加
   戻り値としては、追加後の要素数を返す

PHP Manual:array_push

※ただし、単一の要素を追加するだけならば、array_push関数よりもブラケット構文の方が、
 関数を呼び出すオーバーヘッドがない分よい。

ブラケット構文:配列[] = 追加要素

mixed array_pop (array &$array)
   $array の末尾の要素を1つ除去し、除去した後の配列を戻り値として返す

PHP Manual:array_pop

int array_unshift (array &$array, mixed $var [, mixed $…])
   $var で与えられた要素を $arrayの先頭に追加
   戻り値としては、追加後の要素数を返す

PHP Manual:array_unshift

int array_shift (array &$array)
   $array の先頭の要素を1つ除去し、除去した後の配列を戻り値として返す

PHP Manual:array_shift

※なお、これらを利用して、以下のようなことが表現できる
 ・array_push関数(or ブランケット構文)+array_pop関数→スタック
 ・array_push関数(or ブランケット構文)+array_shift関数→キュー 

スタックとキュー

  • スタック(stack)
      後入れ先出し(LIFOLast In First Out)または、
      先入れ後出し(FILOFirst In Last Out)と呼ばれる構造のこと
      イメージとしては、「キャリアカー」が分かりやすいかも…?
      具体的な機能としては、エディタによくある「やり直し」
  • キュー(Queue)
      先入れ先だし(FIFOFirst In First Out)と呼ばれる構造のこと
      イメージとしては、「コンビニなどのレジ」
      具体的な用途としては、大量のメールをキューとして蓄積しておき、最初にキューに入ったものから順に送信していくやり方

配列に複素数要素を追加/置換/削除

array array_splice (array &$input, int $off [, int $len [, mixed $rep]])
   $input で与えられた配列の $off の位置から $len 個の要素を削除し、$rep を挿入する
   「$len = 0」のとき、削除する要素がないので、挿入となる

PHP Manual:array_splice

配列から特定の要素を取得

array array_slice (array $array, int $off [, int $len [, bool $preserve = FALSE]] )
   $array で与えられた配列の $off の位置から $len 個の要素を取り出す。
   $len を省略すると、末尾まで取得する
   「$preserve = TRUE」とすると、もともとのインデックス番号が引き継がれる

PHP Manual:array_slice

例.
サンプル7

配列の内容を並び替える

bool sort (array &$array [, int $flags = SORT_REGULAR])
   配列を値の低位から高位へと並べる

PHP Manual:sort

※配列を並び替える関数はいくつか種類があるので、それぞれの特徴を表にして見比べてみる

関数名順序ソートキー主な対象キーの維持
sort昇順通常配列×
rsort降順通常配列×
asort昇順連想配列
arsort降順連想配列
ksort昇順キー連想配列
krsort降順キー連想配列

例.
サンプル8

正規表現

正規表現とは、「あいまいな文字列パターンを表現するための記法」です

正規表現 - コトバンク

正規表現を利用するためには
「通常の文字とメタキャラクターを組合せて特定の文字列とマッチするパターン」を
作れなければならない

正規表現の基本


正規表現の構文

/正規表現のパターン/[パターン修飾子]

デリミタ
メタ文字
ドット
繰り返し

正規表現でマッチングを行う

int preg_match (string $pattern, string $subject [, array &$matches [, int $flags [, int $offset]])
   $pattern で指定した正規表現により $subject を検索する
   $matches を指定した場合、$matches[0] にはパターン全体にマッチしたテキストが代入され、
   $matches[1] にはにマッチした文字列が代入される

PHP Manual:preg_match

サンプル9

すべてのマッチした文字列を取得

int preg_match_all (string $pattern, string $subject, array &$matches [, int $flags [, int $offset]])
   $subject を検索し、$pattern に指定した正規表現にマッチしたすべての文字列を、
   $flags で指定した順番で、$matches に代入する
   正規表現にマッチすると、そのマッチした文字列の後から検索が続行される

PHP Manual:preg_match_all

正規表現で文字列を置換

mixed preg_replace (mixed $pattern, mixed $rep, mixed $subject [, int $limit = -1 [, int &$count]])
   $subject に関して $pattern の検索を行い、$rep に置換する
   引数には、文字列だけではなく、配列も指定可能
   また、$limit には置換を行う最大回数を指定できる
   デフォルトは -1 (制限無し)

PHP Manual:preg_replace

正規表現で文字列を分割

array preg_split (string $pattern, string $subject [, int $limit = -1 [, int $flags = 0]])
   $pattern で指定した文字列で、$subject を分割する

PHP Manual:preg_splice

構文そのものは、explode関数とほぼ同じ。
ただし、正規表現を使った処理ははオーバーヘッドが大きい。
単純に固定の文字列で分割するだけならば、explode関数を優先して使うべき。

サンプル10


正規表現パターンの修飾子

PHP Manual:パターン修飾子

大文字・小文字を区別しない

  • i修飾子   検索時に大文字/小文字の違いを無視する

複数行検索に対応

  • m修飾子   「m」は「マルチラインモード」を意味する

置き換えの結果をスクリプトとして実行

  • e修飾子

サンプル11

ファイルシステム関数

ファイルシステム上のフォルダ(ディレクトリ)やファイルを操作するための関数
ただし、操作するユーザーが予めファイルへの書き込み権限を持っているように設定しておかなければならない

ファイルを開く/閉じる

resource fopen (string $file, string $mode)
   $file でオープンするファイルを指定して、$mode で、ファイルを開く際のモードを指定する

PHP Manual:fopen

bool fclose (resource $handle)
   $handle が指しているファイルをクローズする
   クローズが成功したか、失敗したかの値を返す

PHP Manual:fclose

エラー制御演算子

void die ([string $status])
   exiteと同等

しかし、@fopen(〜〜) or die("ファイルオープンに失敗!")という構文でよく使われる
これは、or演算子によるショーカット構文を使用しているため、orの左辺である $fopen でエラーが発生しなければ、無視される。

PHP Manual:die

ファイルへの書き込み

int fwrite (resource $handle, string $str [, int $len])
   $handle が指しているファイルに $str、もしくは $len で指定したバイト数分書き込む
   なお、fwrite のエイリアスは fputs

PHP Manual:fwrite

エイリアスとは?

名前だけが異なる、まったく同じ機能をもった関数のこと

エイリアス - コトバンク

ファイルロック

bool flock (resource $handle, int $ope)
   $handle で指定されたファイルをロックする

PHP Manual:flock

ファイルの読み込み

string fgets (resource $handle [, int $len])
   $handle で指定されたファイルポインタから1行取得する

PHP Manual:fgets

array file (string $filename [, int $flags = 0 [, resource $context]])
   $filename を「配列」に読み込みこむ

PHP Manual:flie

string file_get_contents (string $filename [, int $flags = 0 [, resource $context [, int $offset = -1 [, int $maxlen = -1]]]])
   file関数と似ているが、$offset で指定した場所から開始し、$maxlen バイト分だけファイルの内容を「文字列」に読み込むと

PHP Manual:flie_get_contents

array fgetcsv (resource $handle [, int $len [, string $deli [, string $enclosure [, string $escape]]]])''
   fgets関数に動作は似ているが、fgercsv関数は行をCSVフォーマットのフィールドとして読込み処理を行い、読み込んだフィールドを含む配列を返す 

PHP Manual:fgetcsv

その他の関数

数学関数

PHP Manual:Math関数

変数を破棄

void unset (mixed $var [, mixed $var [, …]])
   $var を破棄する
   破棄された変数は存在しないことになるので、NULLになる
   なお、グローバル変数に関数の中で unset関数を使用した場合、ローカル変数のみが破棄され
   呼出側の環境にある変数は、unset関数がコールされる前と同じ値を保持する 

PHP Manual:unset

変数のデータ型の判定

PHPはデータ型に寛容な言語だが、完全に無視することはできない
特に値の演算や比較では型を意識することがある
そこで、以下のような「is_〜」という関数を使って、変数/リテラルのデータ型を判別し、
その結果をTRUE/FALSEで得る

関数判定する型
is_array配列型
is_bool論理型
is_double/is_float/is_real浮動小数点
is_int/is_integer/is_long整数型
is_nullNULL型
is_numeric数値型or数値形式の文字列
is_objectオブジェクト型
is_resourceリソース型
is_scalarスカラー型
is_string文字列型

参考資料

  • 独習PHP 第2版