PHP関数の引数が覚えられない

# PHP関数の引数が覚えられない
PHP関数の引数の順番が覚えられなくてそのたびググっている。特に引っかかるやつを挙げていく。

## 集合から1つの要素を探すような関数

```php5
in_array(mixed $needle, array $haystack, bool $strict = false): bool
```
needle(要素)が先でhaystack(集合)が次

```php5
array_key_exists(string|int $key, array $array): bool
```
key(要素)が先、array(集合)が次

```php5
array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false
```
needle(要素)が先でhaystack(集合)が次

```php5
strpos(string $haystack, string $needle, int $offset = 0): int|false
```
haystack(集合)が先、needle(要素)が次

```php5
strstr(string $haystack, string $needle, bool $before_needle = false): string|false
```
haystack(集合)が先、needle(要素)が次

```php5
str_contains(string $haystack, string $needle): bool
```
haystack(集合)、needle(要素)

```php5
preg_match(
    string $pattern,
    string $subject,
    array &$matches = null,
    int $flags = 0,
    int $offset = 0
): int|false
```
pattern(要素)が先、subject(集合)が次

:::note info
まとめると、配列と正規表現の関数は要素が1番目で集合が2番目なのに対して、文字列関数は集合が先になる。
:::



## 集合の一部を別の要素に置換する関数

```php5
array_splice(
    array &$array,
    int $offset,
    ?int $length = null,
    mixed $replacement = []
): array
```
array(集合)、offset・length(置換対象)、replacement(置換後の要素)

```php5
substr_replace(
    array|string $string,
    array|string $replace,
    array|int $offset,
    array|int|null $length = null
): string|array
```
string(集合)、replace(置換後の要素)、offset・length(置換対象)

```php5
str_replace(
    array|string $search,
    array|string $replace,
    string|array $subject,
    int &$count = null
): string|array
```

search(置換対象)、replace(置換後の要素)、subject(集合)

```php5
strtr(string $string, string $from, string $to): string
```
```php5
strtr(string $string, array $replace_pairs): string
```
string(集合)、from(置換対象)、to(置換後の要素)
string(集合)、replace_pairs(置換対象=>置換後の要素のペア)

```php5
preg_replace(
    string|array $pattern,
    string|array $replacement,
    string|array $subject,
    int $limit = -1,
    int &$count = null
): string|array|null
```
pattern(置換対象)、replacement(置換後の要素)、subject(集合)

:::note info
まとめると、
文字列関数は集合が先な事が多いが、str_replaceだけは違ってpreg_replaceと同じ順番。
正規表現(preg_replace)はとにかくpattern(対象)が一番目。
array_splice は array_slice に合わせたのかも。
:::

## 集合から一部を抜き出す関数
```php5
array_slice(
    array $array,
    int $offset,
    ?int $length = null,
    bool $preserve_keys = false
): array
```
array(集合)、offset・length(対象)

```php5
substr(string $string, int $offset, ?int $length = null): string
```
string(集合)、offset・length(対象)

:::note info
array_sliceとsubstrは同じ。
:::

## 全体のまとめ

|関数名|分類|引数1|引数2|引数3|引数4|
|-----|----|----|----|----|----|
|in_array|配列|:round_pushpin:needle|:earth_asia:haystack|||
|array_key_exists|配列|:round_pushpin:key|:earth_asia:array|||
|array_search|配列|:round_pushpin:needle|:earth_asia:haystack|||
|strpos|文字列|:earth_asia:haystack|:round_pushpin:needle|||
|strstr|文字列|:earth_asia:haystack|:round_pushpin:needle|||
|str_contains|文字列|:earth_asia:haystack|:round_pushpin:needle|||
|preg_match|正規表現|:round_pushpin:pattern|:earth_asia:subject|matches||
|array_splice|配列|:earth_asia:array|:round_pushpin:offset|:round_pushpin:length|replacement|
|substr_replace|文字列|:earth_asia:string|replace|:round_pushpin:offset|:round_pushpin:length|
|str_replace|文字列|:round_pushpin:search|replace|:earth_asia:subject||
|strtr|文字列|:earth_asia:string|:round_pushpin:from|to||
|preg_replace|正規表現|:round_pushpin:pattern|replacement|:earth_asia:subject||
|array_slice|配列|:earth_asia:array|:round_pushpin:offset|:round_pushpin:length||
|substr|文字列|:earth_asia:string|:round_pushpin:offset|:round_pushpin:length||

:earth_asia: 集合、:round_pushpin: 探す要素 or 置換・検索対象

いくつか法則が見える

:::note info
* 正規表現関数(preg_*) は pattern が引数の1番目になる
* 文字列関数は、集合となる文字列が1番目な事が多い。(例外: str_replace)
* 置換する関数は、置換対象が前で置換後の要素がその次なことが多い。(例外: substr_replace)
* 配列から要素を探す関数は、要素が前で集合が次
:::

str_replace は preg_replace と同じ順番にしたのだろう。
substr_replace は substr と近いが replacement が最後でなく2番目なのは、 replacement は省略不可だが length が省略可能だからだろうか。

これで少しは整理できただろうか。またすぐ忘れそうだなあ


## 参考
* [PHP: array_key_exists](https://www.php.net/manual/ja/function.array-key-exists.php)
* [PHP: array_search](https://www.php.net/manual/ja/function.array-search.php)
* [PHP: array_slice](https://www.php.net/manual/ja/function.array-slice.php)
* [PHP: array_splice](https://www.php.net/manual/ja/function.array-splice.php)
* [PHP: in_array](https://www.php.net/manual/ja/function.in-array.php)
* [PHP: preg_match](https://www.php.net/manual/ja/function.preg-match.php)
* [PHP: preg_replace](https://www.php.net/manual/ja/function.preg-replace.php)
* [PHP: str_contains](https://www.php.net/manual/ja/function.str-contains.php)
* [PHP: str_replace](https://www.php.net/manual/ja/function.str-replace.php)
* [PHP: strpos](https://www.php.net/manual/ja/function.strpos.php)
* [PHP: strtr](https://www.php.net/manual/ja/function.strtr.php)
* [PHP: substr](https://www.php.net/manual/ja/function.substr.php)
* [PHP: substr_replace](https://www.php.net/manual/ja/function.substr-replace.php)