PHPでよく使う内部(ビルドイン)関数をまとめる
はじめに
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
に格納する
- 正規表現にマッチすると、そのマッチした文字列を
数値操作
配列操作
-
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_map
は array_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
- ファイルが書き込み可能かどうかを調べる
定義済み定数
-
定義済み定数
-
M_PI
:Π(円周率) -
M_SQRT2
: 2 の平方根
-
時間操作
※これから紹介する date()
やmktime
、strtotime
これらは32bit のマシンでは 2038 年以降にうまく動作しない問題がある。
したがって DateTime
クラスを使うのがオススメになります。
Discussion