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


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

そこで、コーディングテスト頻出の内部関数の使い方を、使用例を交えてわかりやすく正確にまとめることにしました。
本記事では、**文字列処理のための内部関数**のみを取り上げます。その他の内部関数については、現在に別記事として執筆中です。
（※言語は全てPHPになります）

<br>


##  はじめに
早速ですが、本記事に登場する関数の一覧です。全部で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   文字列を大文字にする 
```

<br>
<br>


## 本題
それでは、１つずつ順に解説していきます。
<br>

### 1. strlen : 文字列の長さ（バイト数）を取得する
![スクリーンショット 2024-04-02 5.07.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/cb8d68c6-9c88-63f7-ed20-73333d48cd2c.png)
```php
// 使用例1
$str = 'abcdef';
echo strlen($str); // 6

$str = ' ab cd ';
echo strlen($str); // 7
```



::: note warn
戻り値は「文字数」ではなく「バイト数」であることに注意。日本語などのマルチバイト文字列の文字数を取得したい場合は、mb＿strlen関数を用いること。

```php
// 例
$str = 'あいう';
echo strlen($str);  // 9 （※ 3 ではない）

$str = 'あいうえお';
echo mb_strlen($str);  // 3
```

:::

<br>

### 2. str_repeat : 文字列を繰り返す

![スクリーンショット 2024-04-02 5.14.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/303e73c4-64a2-72a1-9a69-266bc56122e3.png)
```php
// 使用例
echo str_repeat('ピザ', 10);   // ピザピザピザピザピザピザピザピザピザピザ
```

<br>

### 3. str_split : 文字列を分割し、配列に変換する
![スクリーンショット 2024-04-02 5.23.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/0122d77e-e6c5-8dd0-3d4c-17b89dae9d9c.png)

```php
// 使用例1
$str = "Hello Friend";
$arr1 = str_split($str);

print_r($arr1);
```
```
// 以下、使用例１の出力結果

Array
(
    [0] => H
    [1] => e
    [2] => l
    [3] => l
    [4] => o
    [5] =>
    [6] => F
    [7] => r
    [8] => i
    [9] => e
    [10] => n
    [11] => d
)
```

```php
// 使用例2
$str = "Hello Friend";
$arr2 = str_split($str, 3);

print_r($arr2);
```
```
// 以下、使用例2の出力結果

Array
(
    [0] => Hel
    [1] => lo
    [2] => Fri
    [3] => end
)
```

::: note warn
日本語などのマルチバイト文字列の分割は mb_str_split 関数を用いること。
:::

<br>

### 4. explode : 文字列を任意の文字列により分割し、配列に変換する
![スクリーンショット 2024-04-04 6.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/9ce432df-89b5-f40f-dd26-47e5359b8944.png)
```php
// 使用例
$last_names  = "sato suzuki takahashi";
list($first, $second, $third) = explode(" ", $last_names);
echo $first; // sato
echo $second; // suzuki
echo $third; // takahashi
```

<br>

### 5. strpbrk : 文字列の中から任意の文字を探す
![スクリーンショット 2024-04-04 6.58.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/4accae3a-d056-72fd-79cc-d4811a62ee2a.png)

 strpbrk関数は、引数および戻り値が少しややこしいので、引数と戻り値の詳細についても載せておきます↓
 ![スクリーンショット 2024-04-04 7.01.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/14f37f8d-307b-e2d9-c2e2-35eabeece48a.png)

 
```php
// 使用例
$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');
```

::: note warn
第２引数の `$characters` は大文字小文字が区別されるので注意。
:::

<br>

### 6. str_starts_with : 文字列が指定された部分文字列で始まるかを調べる
![スクリーンショット 2024-04-04 7.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/d456a1ec-ab2d-78ca-ac54-2d3eb40d2757.png)

```php
// 使用例
$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';
}
```
::: note warn
大文字小文字が区別されるので注意。
:::

<br>

### 7. str_ends_with : 文字列が、指定された文字列で終わるかを調べる
![スクリーンショット 2024-04-04 7.15.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/b9a1de04-ff41-d346-8c2d-31a6bbb408bd.png)

```php
// 使用例
$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';
}
```

::: note warn
大文字小文字が区別されるので注意。
:::

<br>


### 8. str_contains : 任意の部分文字列が、文字列に含まれるかを調べる
![スクリーンショット 2024-04-04 7.24.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/35ec732e-38fd-8ef2-2010-06c8f2d20ece.png)

```php
// 使用例
$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';
}
```

::: note warn
大文字小文字が区別されるので注意。
:::

<br>

### 9. preg_match : 正規表現によるマッチングを行う
![スクリーンショット 2024-04-02 5.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/b70afe54-acf5-7630-ccee-e9f282764305.png)
※ 本記事では第３引数 `$matches`、第４引数`$flags`、第５引数 `$offset`の説明は省略します。
```php
// 使用例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."が出力される
```
```php
// 使用例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."が出力される
```
::: note warn
**preg_match 関数の戻り値について**
pattern が指定した subject にマッチした場合 「 1 」 を返す。 マッチしなかった場合は 「 0 」 を返す。 失敗した場合に 「 false 」 を返す。間違いやすいので注意。
:::

<br>

### 10. str_replace : 検索文字列に一致したすべての文字列を置換する
![スクリーンショット 2024-04-02 6.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/64cc285e-dfd3-70e8-1804-3681245ba105.png)
```php
// 使用例1
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");
echo $bodytag;    // <body text='black'>　となる
```
```php
// 使用例2
// 第１引数 $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 となる
```
```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 となる
```
※ 第３引数 `$subject` にも配列を渡すことができますが、ここでは説明を省略します。

::: note warn
str_replace 関数は、**大文字小文字を区別して置換**する。区別せずに置換したい場合は、 str_ireplace 関数を使用すること。
:::

::: note warn
具体的な文字列ではなく正規パターンで検索して置換したい場合は、 preg_replace 関数を使用すること。
:::


<br>

### 11. substr_replace : 文字列の一部を置換する
![スクリーンショット 2024-04-02 6.46.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/f916ba6e-aa58-ab13-83d8-c4b6c8bfb53a.png)
```php
// 使用例1
$string = 'ABCDEFGHIJ';
echo substr_replace($string, 'abc', 0, 2);   // 'abcCDEFGHIJ' （0文字目から２文字切り取って置換）
echo substr_replace($string, 'abc', 2, 4);   // 'ABabcGHIJ' （2文字目から4文字切り取って置換）
```
```php
// 使用例2
// 第４引数 $length が省略された場合、文字列の終点までを切り取って置換する
$string = 'ABCDEFGHIJ';
echo substr_replace($string, 'abc', 2);   // 'ABabc'
```
```php
// 使用例3
// 第４引数 $length が 0 だった場合、$offset の位置への挿入になる
$string = 'ABCDEFGHIJ';
echo substr_replace($string, 'abc', 2, 0);   // 'ABabcCDEFGHIJ'
```

<br>

### 12. strpos : 文字列内の部分文字列が最初に現れる場所を見つける
![スクリーンショット 2024-04-04 7.31.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/237a64f8-925f-eb3a-8112-617632eeeb3c.png)
※ 本記事では、第３引数 `$offset` の説明は省略します。
```php
// 使用例
$mystring = 'abc';
$findme   = 'a';
$pos = strpos($mystring, $findme);   // $pos は 0

// === を使用していることに注目しましょう。単純に == を使ったのでは
// 期待通りに動作しません。なぜなら 'a' が 0 番目 (最初) の文字だからです。
if ($pos === false) {
    echo "文字列 '$findme' は、文字列 '$mystring' の中で見つかりませんでした";
} else {
    echo "文字列 '$findme' が文字列 '$mystring' の中で見つかりました";
    echo " 見つかった位置は $pos です";
}
```
::: note info
文字列内の部分文字列が「最後に」現れる場所を知りたい場合は、strrpos 関数を使用する。
:::

<br>

### 13. substr : 文字列の一部を取得する（指定した位置から、指定した長さ分）
![スクリーンショット 2024-04-04 7.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/0635d133-e52d-12e6-85c7-6bf4c0a87a41.png)
```php
// 使用例
echo substr('abcdef', 1);     // bcdef （第３引数 $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
```

::: note info
文字列の１文字だけを取得する場合は、substr 関数を使わなくても以下のようにして取得することができる。
```php
$string = 'abcdef';
echo $string[0];                 // a
echo $string[3];                 // d
echo $string[strlen($string)-1]; // f
```
:::

<br>

### 14. substr_count : 副文字列の出現回数を数える
![スクリーンショット 2024-04-04 16.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/7b7bba51-62e3-2c02-d52e-cfa369fc3801.png)
```php
// 使用例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);
```

```php
// 使用例2
// 重なっている副文字列はカウントされないので、1 が表示される
$text2 = 'gcdgcdgcd';
echo substr_count($text2, 'gcdgcd');
```


### 15. strstr : 副文字列が最初に現れた位置から文字列の終わりまでを取得する
![スクリーンショット 2024-04-04 16.34.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/21aa544c-35f7-ddef-b2fb-52a9126ebd16.png)
```php
// 使用例
$email  = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // @example.com
```

::: note info
**第３引数 `$before_needle` について**
`$before_needle` を true にすると、strstr() の戻り値は、haystack の中で最初に needle があらわれる箇所より前 (needle は含めない)の部分となります。
```php
// 例
$email  = 'name@example.com';
$user = strstr($email, '@', true);
echo $user; // name
```
:::

::: note warn
大文字小文字を区別することに注意。 大文字小文字を区別しない検索を行う場合は、stristr() 関数を使用すること。
:::

::: note warn
もし特定の haystack に needle があるかどうかを調べるだけの場合、 より高速でメモリ消費も少ない strpos() を代わりに使用すること。
:::

### 16. str_pad : 文字列を固定長の他の文字列でパディングする
![スクリーンショット 2024-04-04 17.03.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/805d445c-d9b4-b6b8-7011-f86783bd1ada.png)
```php
// 使用例
$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の長さ以下の場合はパディングされない
```

::: note info
**第３引数 $pad_type について**
`$pad_type` でパディングする位置を指定する。

STR_PAD_RIGHT → 右側をパディング （※ デフォルト）
STR_PAD_LEFT  → 左側をパディング
STR_PAD_BOTH  → 両側をパディング
:::

::: note warn
日本語などのマルチバイト文字列をパディングする場合は mb_str_pad 関数を使用すること。
:::

<br>

### 17. mb_strtolower : 文字列を小文字にする
![スクリーンショット 2024-04-04 17.43.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/4959e7c7-9132-54c3-327a-9f1e7d2cd8b5.png)
```php
// 使用例
$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
```
::: note info
**第２引数 `$encoding` について**
`$encoding` パラメータには文字エンコーディングを指定する。省略した場合、もしくは null の場合は、 内部文字エンコーディングを使用する。
:::

<br>

### 18. mb_strtoupper : 文字列を大文字にする 
![スクリーンショット 2024-04-04 17.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486417/e0eb1759-f9a1-eb02-0d36-b81ff019731d.png)
```php
// 使用例
$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
```
::: note info
**第２引数 `$encoding` について**
`$encoding` パラメータには文字エンコーディングを指定する。省略した場合、もしくは null の場合は、 内部文字エンコーディングを使用する。
:::

<br>

---

以上になります。
コーディングテストに頻出の内部関数について知っておくことは、スピーディに問題を解くために必要不可欠です。
今回紹介した18個の内部関数をしっかり覚えておきましょう！

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

https://qiita.com/Sho-taro/items/a104a1bdcfa06ed3bb4a

https://qiita.com/Sho-taro/items/5d035df0d57938bf6a98