LoginSignup
0
0

コーディングテスト頻出の内部関数 まとめ(その1 - 文字列処理関数)[PHP]

Last updated at Posted at 2024-04-04

この記事の目的

未経験エンジニアが転職活動をする際、最初の難関となるのがコーディングテストです。ここを突破しないと面接にすら進めません。
極度のプレッシャーの中、素早く正確に問題を解くためには、「自分が使っている言語にどのような内部関数があるのか」「どうやって使うのか」などを事前に把握しておくことが必須と言えます。

そこで、コーディングテスト頻出の内部関数の使い方を、使用例を交えてわかりやすく正確にまとめることにしました。
本記事では、文字列処理のための内部関数のみを取り上げます。その他の内部関数については、現在に別記事として執筆中です。
(※言語は全て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 : 文字列の長さ(バイト数)を取得する

スクリーンショット 2024-04-02 5.07.51.png

// 使用例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 : 文字列を繰り返す

スクリーンショット 2024-04-02 5.14.21.png

// 使用例
echo str_repeat('ピザ', 10);   // ピザピザピザピザピザピザピザピザピザピザ

3. str_split : 文字列を分割し、配列に変換する

スクリーンショット 2024-04-02 5.23.56.png

// 使用例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 : 文字列を任意の文字列により分割し、配列に変換する

スクリーンショット 2024-04-04 6.45.40.png

// 使用例
$last_names  = "sato suzuki takahashi";
list($first, $second, $third) = explode(" ", $last_names);
echo $first; // sato
echo $second; // suzuki
echo $third; // takahashi

5. strpbrk : 文字列の中から任意の文字を探す

スクリーンショット 2024-04-04 6.58.51.png

strpbrk関数は、引数および戻り値が少しややこしいので、引数と戻り値の詳細についても載せておきます↓
スクリーンショット 2024-04-04 7.01.02.png

// 使用例
$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 : 文字列が指定された部分文字列で始まるかを調べる

スクリーンショット 2024-04-04 7.07.19.png

// 使用例
$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 : 文字列が、指定された文字列で終わるかを調べる

スクリーンショット 2024-04-04 7.15.59.png

// 使用例
$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 : 任意の部分文字列が、文字列に含まれるかを調べる

スクリーンショット 2024-04-04 7.24.24.png

// 使用例
$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 : 正規表現によるマッチングを行う

スクリーンショット 2024-04-02 5.41.41.png
※ 本記事では第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 : 検索文字列に一致したすべての文字列を置換する

スクリーンショット 2024-04-02 6.08.14.png

// 使用例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 : 文字列の一部を置換する

スクリーンショット 2024-04-02 6.46.49.png

// 使用例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 : 文字列内の部分文字列が最初に現れる場所を見つける

スクリーンショット 2024-04-04 7.31.59.png
※ 本記事では、第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 : 文字列の一部を取得する(指定した位置から、指定した長さ分)

スクリーンショット 2024-04-04 7.48.32.png

// 使用例
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 : 副文字列の出現回数を数える

スクリーンショット 2024-04-04 16.23.26.png

// 使用例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 : 副文字列が最初に現れた位置から文字列の終わりまでを取得する

スクリーンショット 2024-04-04 16.34.35.png

// 使用例
$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 : 文字列を固定長の他の文字列でパディングする

スクリーンショット 2024-04-04 17.03.23.png

// 使用例
$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 : 文字列を小文字にする

スクリーンショット 2024-04-04 17.43.59.png

// 使用例
$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 : 文字列を大文字にする

スクリーンショット 2024-04-04 17.47.02.png

// 使用例
$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個の内部関数をしっかり覚えておきましょう!

別記事にて「数値処理関数」「配列処理関数」についても解説してますので、そちらも参考にして下さい!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0