この記事の目的
未経験エンジニアが転職活動をする際、最初の難関となるのがコーディングテストです。ここを突破しないと面接にすら進めません。
極度のプレッシャーの中、素早く正確に問題を解くためには、「自分が使っている言語にどのような内部関数があるのか」「どうやって使うのか」などを事前に把握しておくことが必須と言えます。
そこで、コーディングテスト頻出の内部関数の使い方を、使用例を交えてわかりやすく正確にまとめることにしました。
本記事では、文字列処理のための内部関数のみを取り上げます。その他の内部関数については、現在に別記事として執筆中です。
(※言語は全てPHPになります)
はじめに
早速ですが、本記事に登場する関数の一覧です。全部で18個の関数を取り上げます。
1. strlen 文字列の長さ(バイト数)を取得する
2. str_repeat 文字列を繰り返す
3. str_split 文字列を分割し、配列に変換する
4. explode 文字列を任意の文字列により分割し、配列に変換する
5. strpbrk 文字列の中から任意の文字を探す
6. str_starts_with 文字列が指定された部分文字列で始まるかを調べる
7. str_ends_with 文字列が、指定された文字列で終わるかを調べる
8. str_contains 任意の部分文字列が、文字列に含まれるかを調べる
9. preg_match 正規表現によるマッチングを行う
10. str_replace 検索文字列に一致したすべての文字列を置換する
11. substr_replace 文字列の一部を置換する
12. strpos 文字列内の部分文字列が最初に現れる場所を見つける
13. substr 文字列の一部を取得する(指定した位置から、指定した長さ分)
14. substr_count 副文字列の出現回数を数える
15. strstr 副文字列が最初に現れた位置から文字列の終わりまでを取得する
16. str_pad 文字列を固定長の他の文字列でパディングする
17. mb_strtolower 文字列を小文字にする
18. mb_strtoupper 文字列を大文字にする
本題
それでは、1つずつ順に解説していきます。
1. strlen : 文字列の長さ(バイト数)を取得する
// 使用例1
$str = 'abcdef';
echo strlen($str); // 6
$str = ' ab cd ';
echo strlen($str); // 7
戻り値は「文字数」ではなく「バイト数」であることに注意。日本語などのマルチバイト文字列の文字数を取得したい場合は、mb_strlen関数を用いること。
// 例
$str = 'あいう';
echo strlen($str); // 9 (※ 3 ではない)
$str = 'あいうえお';
echo mb_strlen($str); // 3
2. str_repeat : 文字列を繰り返す
// 使用例
echo str_repeat('ピザ', 10); // ピザピザピザピザピザピザピザピザピザピザ
3. str_split : 文字列を分割し、配列に変換する
// 使用例1
$str = "Hello Friend";
$arr1 = str_split($str);
print_r($arr1);
// 以下、使用例1の出力結果
Array
(
[0] => H
[1] => e
[2] => l
[3] => l
[4] => o
[5] =>
[6] => F
[7] => r
[8] => i
[9] => e
[10] => n
[11] => d
)
// 使用例2
$str = "Hello Friend";
$arr2 = str_split($str, 3);
print_r($arr2);
// 以下、使用例2の出力結果
Array
(
[0] => Hel
[1] => lo
[2] => Fri
[3] => end
)
日本語などのマルチバイト文字列の分割は mb_str_split 関数を用いること。
4. explode : 文字列を任意の文字列により分割し、配列に変換する
// 使用例
$last_names = "sato suzuki takahashi";
list($first, $second, $third) = explode(" ", $last_names);
echo $first; // sato
echo $second; // suzuki
echo $third; // takahashi
5. strpbrk : 文字列の中から任意の文字を探す
strpbrk関数は、引数および戻り値が少しややこしいので、引数と戻り値の詳細についても載せておきます↓
// 使用例
$text = 'This is a Simple text.';
// 英小文字のmまたはiを探す。
// これは "is is a Simple text." を出力します。なぜなら 'i' が最初にマッチするからです。
echo strpbrk($text, 'mi');
// 英大文字のSを探す。
// これは "Simple text." を出力します。なぜなら大文字小文字が区別されるからです。
echo strpbrk($text, 'S');
第2引数の $characters
は大文字小文字が区別されるので注意。
6. str_starts_with : 文字列が指定された部分文字列で始まるかを調べる
// 使用例
$string = 'The lazy fox jumped over the fence'; // 先頭の 'The' が大文字
if (str_starts_with($string, 'The')) { // この判別式は true
echo "The string starts with 'The'\n";
}
if (str_starts_with($string, 'the')) { // この判別式は false
echo 'The string starts with "the"';
} else {
echo '"the" was not found because the case does not match';
}
大文字小文字が区別されるので注意。
7. str_ends_with : 文字列が、指定された文字列で終わるかを調べる
// 使用例
$string = 'The lazy fox jumped over the fence'; // 最後の'fense'が小文字
if (str_ends_with($string, 'fence')) { // この判別式は true
echo "The string ends with 'fence'\n";
}
if (str_ends_with($string, 'Fence')) { // この判別式は false
echo 'The string ends with "Fence"';
} else {
echo '"Fence" was not found because the case does not match';
}
大文字小文字が区別されるので注意。
8. str_contains : 任意の部分文字列が、文字列に含まれるかを調べる
// 使用例
$string = 'The lazy fox jumped over the fence'; // 'lazy'という単語が小文字
if (str_contains($string, 'lazy')) { // この判別式は true
echo "The string 'lazy' was found in the string\n";
}
if (str_contains($string, 'Lazy')) { // この判別式は false
echo 'The string "Lazy" was found in the string';
} else {
echo '"Lazy" was not found because the case does not match';
}
大文字小文字が区別されるので注意。
9. preg_match : 正規表現によるマッチングを行う
※ 本記事では第3引数 $matches
、第4引数$flags
、第5引数 $offset
の説明は省略します。
// 使用例1
// パターンのデリミタの後の "i" は、大小文字を区別しない検索を示す
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
// "A match was found."が出力される
// 使用例2
/* パターン内の \b は単語の境界を示す。このため、独立した単語の
* "web"にのみマッチし、"webbing" や "cobweb" のような単語の一部にはマッチしない */
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
// "A match was found."が出力される
if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
// "A match was not found."が出力される
preg_match 関数の戻り値について
pattern が指定した subject にマッチした場合 「 1 」 を返す。 マッチしなかった場合は 「 0 」 を返す。 失敗した場合に 「 false 」 を返す。間違いやすいので注意。
10. str_replace : 検索文字列に一致したすべての文字列を置換する
// 使用例1
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");
echo $bodytag; // <body text='black'> となる
// 使用例2
// 第1引数 $search には配列も渡すことができる
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");
echo $onlyconsonants; // Hll Wrld f PHP となる
// 使用例3
// 第2引数 $replace にも配列を渡すことができる
$phrase = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy = array("pizza", "beer", "ice cream");
// 'fruits' を 'pizza' に、'vegetables' を 'beer' に、 'fiber' を 'ice cream' に置換する
// このような場合、$healthy と $yummy の要素の数は同数であることが望ましい
$newphrase = str_replace($healthy, $yummy, $phrase);
echo $newphrase; // You should eat pizza, beer, and ice cream every day となる
※ 第3引数 $subject
にも配列を渡すことができますが、ここでは説明を省略します。
str_replace 関数は、大文字小文字を区別して置換する。区別せずに置換したい場合は、 str_ireplace 関数を使用すること。
具体的な文字列ではなく正規パターンで検索して置換したい場合は、 preg_replace 関数を使用すること。
11. substr_replace : 文字列の一部を置換する
// 使用例1
$string = 'ABCDEFGHIJ';
echo substr_replace($string, 'abc', 0, 2); // 'abcCDEFGHIJ' (0文字目から2文字切り取って置換)
echo substr_replace($string, 'abc', 2, 4); // 'ABabcGHIJ' (2文字目から4文字切り取って置換)
// 使用例2
// 第4引数 $length が省略された場合、文字列の終点までを切り取って置換する
$string = 'ABCDEFGHIJ';
echo substr_replace($string, 'abc', 2); // 'ABabc'
// 使用例3
// 第4引数 $length が 0 だった場合、$offset の位置への挿入になる
$string = 'ABCDEFGHIJ';
echo substr_replace($string, 'abc', 2, 0); // 'ABabcCDEFGHIJ'
12. strpos : 文字列内の部分文字列が最初に現れる場所を見つける
※ 本記事では、第3引数 $offset
の説明は省略します。
// 使用例
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme); // $pos は 0
// === を使用していることに注目しましょう。単純に == を使ったのでは
// 期待通りに動作しません。なぜなら 'a' が 0 番目 (最初) の文字だからです。
if ($pos === false) {
echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした";
} else {
echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました";
echo " 見つかった位置は $pos です";
}
文字列内の部分文字列が「最後に」現れる場所を知りたい場合は、strrpos 関数を使用する。
13. substr : 文字列の一部を取得する(指定した位置から、指定した長さ分)
// 使用例
echo substr('abcdef', 1); // bcdef (第3引数 $length が省略された場合は、 $offset の位置から文字列の最後までが切り取られる。)
echo substr("abcdef", 1, null); // bcdef, PHP 8.0.0 より前のバージョンでは、空の文字列を返していた。
echo substr('abcdef', 1, 3); // bcd
echo substr('abcdef', 0, 4); // abcd
echo substr('abcdef', 0, 8); // abcdef
echo substr('abcdef', -1, 1); // f
文字列の1文字だけを取得する場合は、substr 関数を使わなくても以下のようにして取得することができる。
$string = 'abcdef';
echo $string[0]; // a
echo $string[3]; // d
echo $string[strlen($string)-1]; // f
14. substr_count : 副文字列の出現回数を数える
// 使用例1
$text = 'This is a test';
echo substr_count($text, 'is'); // 2
// 文字列は 's is a test' になっているので, 1 が表示される
echo substr_count($text, 'is', 3);
// テキストは 's i' になっているので, 0 が表示される
echo substr_count($text, 'is', 3, 3);
echo strlen($text); // 14
// 5+10 > 14 なので、警告が発生する
echo substr_count($text, 'is', 5, 10);
// 使用例2
// 重なっている副文字列はカウントされないので、1 が表示される
$text2 = 'gcdgcdgcd';
echo substr_count($text2, 'gcdgcd');
15. strstr : 副文字列が最初に現れた位置から文字列の終わりまでを取得する
// 使用例
$email = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // @example.com
第3引数 $before_needle
について
$before_needle
を true にすると、strstr() の戻り値は、haystack の中で最初に needle があらわれる箇所より前 (needle は含めない)の部分となります。
// 例
$email = 'name@example.com';
$user = strstr($email, '@', true);
echo $user; // name
大文字小文字を区別することに注意。 大文字小文字を区別しない検索を行う場合は、stristr() 関数を使用すること。
もし特定の haystack に needle があるかどうかを調べるだけの場合、 より高速でメモリ消費も少ない strpos() を代わりに使用すること。
16. str_pad : 文字列を固定長の他の文字列でパディングする
// 使用例
$input = "Alien";
echo str_pad($input, 10); // "Alien "
echo str_pad($input, 10, "-=", STR_PAD_LEFT); // "-=-=-Alien"
echo str_pad($input, 10, "_", STR_PAD_BOTH); // "__Alien___"
echo str_pad($input, 6, "___"); // "Alien_"
echo str_pad($input, 3, "*"); // $length が $inputの長さ以下の場合はパディングされない
第3引数 $pad_type について
$pad_type
でパディングする位置を指定する。
STR_PAD_RIGHT → 右側をパディング (※ デフォルト)
STR_PAD_LEFT → 左側をパディング
STR_PAD_BOTH → 両側をパディング
日本語などのマルチバイト文字列をパディングする場合は mb_str_pad 関数を使用すること。
17. mb_strtolower : 文字列を小文字にする
// 使用例
$str = "Mary Had A Little Lamb and She LOVED It So";
$str = mb_strtolower($str);
echo $str; // 結果は mary had a little lamb and she loved it so
第2引数 $encoding
について
$encoding
パラメータには文字エンコーディングを指定する。省略した場合、もしくは null の場合は、 内部文字エンコーディングを使用する。
18. mb_strtoupper : 文字列を大文字にする
// 使用例
$str = "Mary Had A Little Lamb and She LOVED It So";
$str = mb_strtoupper($str);
echo $str; // 結果は MARY HAD A LITTLE LAMB AND SHE LOVED IT SO
第2引数 $encoding
について
$encoding
パラメータには文字エンコーディングを指定する。省略した場合、もしくは null の場合は、 内部文字エンコーディングを使用する。
以上になります。
コーディングテストに頻出の内部関数について知っておくことは、スピーディに問題を解くために必要不可欠です。
今回紹介した18個の内部関数をしっかり覚えておきましょう!
別記事にて「数値処理関数」「配列処理関数」についても解説してますので、そちらも参考にして下さい!