⚙️

PHPでよく使う内部(ビルドイン)関数をまとめる

2023/08/16に公開

はじめに

PHPでは文字列や配列を操作を扱う際に既に用意されている内部(ビルドイン)関数を使う事で、効率的に記述する事ができます。
この記事では普段よく使う内部(ビルドイン)関数をまとめました。
(ここで上げている関数は氷山の一角なので、参考にする際は本家の https://www.php.net/manual/ja をご覧ください)

注意として、PHP8.1からは一部の内部関数がnullを渡すことは非推奨になったので、明示的にnullableを指定する事になった事を覚えておいてください。

ビルトイン関数のスカラー型の引数には、 デフォルトの自動変換(coercive)モードの場合、 null を渡すことが出来ます。 PHP 8.1.0 以降では、 nullable として宣言されていない内部関数の引数に null を渡すことは推奨されなくなり、 自動変換モードでは警告が発生するようになっています。 ユーザ定義の関数においては、スカラー型の引数は nullable と明示的にマークする必要があり、その振る舞いと合わせるためです。
ref:PHP: 内部(ビルトイン)関数 - Manual

文字列操作

  • sprintf
    • %sで文字列を、%fで浮動小数点の値を受け取れる。また、左詰めなどの指定方法も出来る。
  • strlen
    • 文字列の長さを計測する
  • trim
    • 前後の空白や改行を除去する
  • strpos
    • 文字列のから特定の文字があるかを探す。なかったらfalseが返って来る。あったら、見つかった位置番号が返ってくる。
  • str_replace
    • 文字列の特定の文字を別の文字に置き換える
  • mb_strlen
    • マルチバイト(日本語)の文字列の長さを計測する
  • mb_strpos
    • マルチバイトの文字列の中で特定の文字があるかを探す
  • substr
    • 文字列の一部分を返す
  • substr_replace
    • 文字列の一部を置換する
  • number_format
    • 数字を千の位毎にグループ化してフォーマットする
  • preg_match
    • 正規表現にマッチすると、そのマッチした最初のmatchesに格納する
  • preg_match_all
    • 正規表現にマッチすると、そのマッチした文字列をmatchesに格納する

数値操作

  • ceil
    • 少数点を切り上げる
  • floor
    • 少数以下を切り捨てる
  • round
    • 四捨五入して整数にする
  • mt_rand
    • 乱数を設定する
  • max
    • 最大値を求める
  • min
    • 最小値を求める

配列操作

  • array_unshift
    • 一つ以上の要素を配列の最初に加える
    • array_unshift($scores, 10, 20)
  • array_push
    • 一つ以上の要素を配列の最後に追加する
    • array_push($scores, 60, 70)
  • array_shift
    • 配列の先頭から要素を一つ取り出す
    • $value = array_shift($scores): この場合は先頭の要素にある 10$valueに格納される
  • array_pop
    • 配列の末尾から要素を一つ取り出す
    • $value = array_pop($scores): この場合は先頭の要素にある 70$valueに格納される
  • array_slice
    • 配列の一部を展開する
    • array_slice($scores , 2);
  • array_splice
    • 配列の一部を削除し、他の要素で置換する。または途中の要素を削除して詰める
    • array_splice(配列、位置、個数、要素)で指定すると、削除した位置に要素を入れる事ができる
  • array_fill
    • 配列を指定した値で埋める
    • $scores = array_fill(0,5,10);
  • range
    • ある範囲の整数を有する配列を作成する
    • $scores = range(1,10);: 1~10までの値を使って配列を順々に入れる
    • $scores = range(1,10,2);: 1~10まで、2刻みで値を使って配列を順々に入れる
  • array_merge
    • 配列を連結させる。
    • $merged = array_merge($a,$b);
    • $merged = [...$a, ...$b]; でも置き換えできる。
  • array_unique
    • 重複した値を取り除く。元配列に変更を加えずに新しい配列を作ってくれる、
    • $uniques = array_unique($merged);
  • array_diff
    • 配列の差を計算する。
    • $dif1 = array_diff($a,$b);
  • array_intersect
    • 配列の共通項を計算する
    • $common = array_intersect($a,$b);
  • sort
    • 配列を昇順にソートする。
    • このsortは既存のkeyを削除します
  • rsort
    • 配列を昇順にソートする
    • このrsortはsortと同様に既存のkeyを削除します
  • asort
    • 連想キーと要素との関係を維持しつつ配列を昇順にソートする
  • rasort
    • 連想キーと要素との関係を維持しつつ配列を降順にソートする
  • ksort
    • 配列をキーで昇順にソートする
  • krsort
    • 配列をキーで降順にソートする
  • usort
    • ユーザー定義の比較関数を使用して、配列を値でソートする
  • array-multisort
    • 複数または多次元の配列をソートする
    • あまり使わない方がいい。

array_map と array_filter の違い

  • array_map
    • 指定した配列の要素にコールバック関数を適用する
$prices = [100, 200, 300];
$newPrices = array_map(
  // 無名関数
  function($n) { return $n * 1.1;},
  $prices
);
  • array_filter
    • コールバック関数を使用して、配列の要素をフィルタリングする
<?php

$numbers = range(1, 10);
// 偶数だけ欲しい
$evenNumbers = array_filter(
  $numbers,
  fn($n) => $n % 2 === 0
);

array_maparray_filterの大きな違いは区別して適用するか、しないかがでかい。
後、引数の順番が逆。後に来るのが、array_map、先に来るのがarray_filter です。

mapは、配列要素すべてに除算する関数を実行し、その計算結果を新しい配列で返しています。
filterは、配列要素の中で除算できる要素を探し、フィルタリングされた要素のみを配列で返しています。
mapは区別せずにすべての要素を返すのに対し、filterは条件内容によって要素を区別することが大きな違いです

array_map は マッピング(写像)なので要素数を変えずに各要素を変化させるもの
array_filter は フィルタリング(ふるい落とし) なので各要素は変えずに要素数を減らすもの。って理解してます。
ref: https://twitter.com/todays_mitsui/status/1658972790568140800?s=20

他にはforeach, array_map, array_walkの比較 - Qiitaも参考になる

配列操作の動作確認まとめ

<?php
$scores = [30, 40, 50, 60, 70];

array_unshift($scores, 10, 20); // 10, 20, 30, 40, 50, 60, 70
array_push($scores, 80, 90); // 10, 20, 30, 40, 50, 60, 70, 80, 90

$value1 = array_shift($scores) // 10
print_r(scores) // 20, 30, 40, 50, 60, 70, 80, 90

$value2 = array_shift($scores) // 90
array_pop($scores) // 20, 30, 40, 50, 60, 70, 80

$partial1 = array_slice($scores , 2);
print_r($scores); // 20, 30, 40, 50, 60, 70, 80
print_r($partial); // 40, 50, 60, 70, 80

$partial12 = array_slice($scores , -2);
print_r($partial1); // 60, 70, 80

// 切り詰める使い方
$scores1 = [30, 40, 50, 60, 70, 80];
array_splice($scores1,2,3);
print_r($scores1); // 30,40,80

// 置換する方法
$scores2 = [30, 40, 50, 60, 70, 80];
array_splice($scores2,2,3,100);
print_r($scores2); // 30,40,80,100

// 指定した位置に要素を入れる方法
$scores3 = [30, 40, 50];
array_splice($scores3,2,0,100);
print_r($scores3); // 20,40,100,50

// 0のインデックスから 5 個分を 10 の値で埋めた配列を作成する
$scores4 = array_fill(0,5,10);
// $scores4 = [10,10,10,10,10

// 1~10 までの値を使って配列を作成する
// array1 = [1,2,3,4,5,6,7,8,9,10];
$array1 = range(1,10);

// 1~10までで、2刻みで値を使って配列を作成する
// array1 = [1,3,5,7,9];
$array2 = range(1,2,10);

ファイル操作

  • fopen
    • fopen — ファイルまたは URL をオープンする
    • w:書き出しのみでオープンします。
      • ファイルポインタをファイルの先頭に置き、 ファイルサイズをゼロにします。ファイルが存在しない場合には作成を試みます。
    • r:読み込みのみでオープンします。ファイルポインタをファイルの先頭に置きます。
  • fwrite
    • バイナリセーフなファイル書き込み処理を行う
  • fclose
    • オープンされたファイルポインタをクローズする
  • fgets
    • ファイルポインタから 1 行取得する。
    • fgetsは終端まで行くとfalseを返します
  • file_put_contents
    • fopenを使わずに文字列をファイルに書き込む
  • file_get_contents
    • fopenを使わずにファイルの内容を全て文字列に読み込む
  • file
    • ファイル全体を読み込んで配列に格納する
    • 末尾の改行を無視して読むこむには以下のように指定する
      • $lines = file('names.txt',FILE_IGNORE_NEW_LINES);
  • opendir
    • ディレクトリをオープンして、操作を行う。
  • globl
    • パターンにマッチするパス名を探す
    • glob('data/*.txt'
  • file_exists
    • ファイルまたはディレクトリが存在するかどうかを調べる
  • is_readable
    • ファイルが読み込み可能かどうかを調べる
  • is_writable
    • ファイルが書き込み可能かどうかを調べる

定義済み定数

時間操作

※これから紹介する date()mktimestrtotime
これらは32bit のマシンでは 2038 年以降にうまく動作しない問題がある。
したがって DateTime クラスを使うのがオススメになります。

  • date
    • Unixタイムスタンプを書式化する
  • mktime
    • 日付を Unix のタイムスタンプとして取得する
  • strtotime
    • 英文形式の日付を Unix タイムスタンプに変換する

参考

Discussion