【情報整理⑤】PHPの頻出関数を整理して、画面遷移過多による眼病を予防 ~ 配列編 ~

- Netflixによって世界中から人気を博している「こんまり」さんに、多大な影響を受けて情報整理をしていく記事第五弾。
- [前回からの健康活動](https://qiita.com/t_o_d/items/2ca3160b4d7267f08bb3)が、「実は整理するために大量に検索しているぶん、画面遷移量は変わらないので、角膜損傷が悪化している」という誰でも分かる事実と、見事に距離を置きながら生活をする現状。
- 今回は、PHPの頻出関数の「配列」を整理していくことにしよう。

## PHP頻出関数

<!-- TOC -->

- [PHP頻出関数](#php頻出関数)
    - [配列](#配列)
        - [array_key_exists()](#array_key_exists)
        - [array_slice()](#array_slice)
        - [array_merge(), array_merge_recursive()](#array_merge-array_merge_recursive)
        - [in_array()](#in_array)
        - [shuffle()](#shuffle)
        - [sort(), rsort()](#sort-rsort)
        - [asort(), arsort()](#asort-arsort)
        - [ksort(), krsort()](#ksort-krsort)
        - [usort(), uasort(), uksort()](#usort-uasort-uksort)
        - [array_multisort()](#array_multisort)
        - [array_unique()](#array_unique)
        - [array_reverse()](#array_reverse)
        - [array_shift(), array_pop()](#array_shift-array_pop)
        - [array_walk(), array_walk_recursive()](#array_walk-array_walk_recursive)
        - [array_search()](#array_search)
        - [implode(), explode()](#implode-explode)
        - [range()](#range)
        - [current()](#current)
        - [next(), prev()](#next-prev)
        - [reset(), end()](#reset-end)
        - [extract()](#extract)
        - [list()](#list)
        - [is_array()](#is_array)
- [まとめ](#まとめ)
- [参考](#参考)

<!-- /TOC -->

### 配列

#### array_key_exists()

- 指定したキー、または添字が配列にあるか、調べる。

- issetの違い
    - キーがNULLでも、「true」が出る。

- [公式マニュアル](http://php.net/manual/ja/function.array-key-exists.php)

```php
// array_key_exists( 'キー', $配列名 )

$search_array = array('number' => 1, 'name' => '佐藤');
if (array_key_exists('neme', $search_array)) {
    echo 'ある';
}else{
    echo 'ない';
}

// 実行結果

// ない
```

#### array_slice()

- 配列から連続した要素を取得する。

- [公式マニュアル](http://php.net/manual/ja/function.array-slice.php)

```php
// array_slice(取得元配列,開始位置,要素数)

$name = array('佐藤','田中','鈴木','上野','高橋','斉藤','中野');
$result = array_slice($name,2,3);
foreach($result as $key => $value){
  echo "$key : $value\n";
}

// 実行結果

/*
0 : 鈴木
1 : 上野
2 : 高橋
*/
```

#### array_merge(), array_merge_recursive()

- 配列同士を一つの配列に結合する。

- array_merge_recursive() は同じ文字列のキーを持つ要素がある場合、上書きされないため、多次元配列としても利用。

- [公式マニュアル](http://php.net/manual/ja/function.array-merge.php)

- [公式マニュアル](http://php.net/manual/ja/function.array-merge-recursive.php)

```php
// array_merge(配列1,配列2,配列3)

<?php
$data = array('name' => '佐藤', '田中', '大橋');
$info = array("田中", "大橋", "name" => "鈴木", "age" => 56, '高橋');
$result = array_merge($data, $info);
print_r($result);
?>

// 実行結果

/*
Array
(
    [name] => 鈴木
    [0] => 田中
    [1] => 大橋
    [2] => 田中
    [3] => 大橋
    [age] => 56
    [4] => 高橋
)
*/
```

```php
// array_merge_recursive(配列1,配列2,配列3)

<?php
$data = array("name" => array("nickname" => "さとっち"), '鈴木');
$info = array('上野', "name" => array("nickname" => "たなくん", "高橋"));
$result = array_merge_recursive($data, $info);
print_r($result);

// 実行結果

/*
Array
(
    [name] => Array
        (
            [nickname] => Array
                (
                    [0] => さとっち
                    [1] => たなくん
                )

            [0] => 高橋
        )

    [0] => 鈴木
    [1] => 上野
)
*/
```

#### in_array()

- 配列の中に指定された値が含まれているかを返す。

- 第三引数指定は任意だが、デフォルトがfalseのため、trueを指定しとかないと、予期せぬ結果を起こす可能性がある。

- [公式マニュアル](http://php.net/manual/ja/function.in-array.php)

```php
// in_array('キー', $配列, true)

$numbers = [0, 1, 2, 3, 4, 5];
var_dump(in_array(3,$numbers, true));
var_dump(in_array('佐藤', $numbers, true));

// 実行結果

/*
bool(true)
bool(false)
*/
```

#### shuffle()

- 配列をランダムにシャッフルする。

- [公式マニュアル](http://php.net/manual/ja/function.shuffle.php)

```php
// shuffle(配列)

$numbers = [1,3,5,7,9];
shuffle($numbers);
foreach ($numbers as $number) {
    echo "$number\n";
}

// 実行結果

/*
7
3
9
5
1
*/
```

#### sort(), rsort()

- 配列を昇順、降順でソート（並び替え）する。

- 動作オプション指定で、より厳密な並び順が指定できる。

- [公式マニュアル](http://php.net/manual/ja/function.sort.php)

- [公式マニュアル](http://php.net/manual/ja/function.rsort.php)

```php
// sort(配列,動作オプション)

$numbers = array(4,3,2,8,34,6463,353,653);
sort($numbers);
foreach($numbers as $key => $value){
    echo "$key : $value\n";
}

// 実行結果

/*
0 : 2
1 : 3
2 : 4
3 : 8
4 : 34
5 : 353
6 : 653
7 : 6463
*/
```

```php
// 動作オプション指定の場合。

$names = array("a1", "A6", "a2", "B1");
sort($names, SORT_NATURAL | SORT_FLAG_CASE);
foreach ($names as $key => $value) {
    echo "$key : $value\n";
}

// 実行結果

/*
0 : a1
1 : a2
2 : A6
3 : B1
*/
```

#### asort(), arsort()

- 連想配列を昇順、降順でソート（並び替え）する。もともとのキーは保持される。

- [公式マニュアル](http://php.net/manual/ja/function.asort.php)

- [公式マニュアル](http://php.net/manual/ja/function.arsort.php)

```php
// asort(連想配列,動作オプション)

$data = ['name' => 'john','age' => 78,'hobby' => 'anime','job' => 'engineer'];
asort($data);
foreach($data as $key => $value){
    echo "$key : $value\n";
}

// 実行結果

/*
hobby : anime
job : engineer
name : john
age : 78
*/
```

```php
// 動作オプション指定

$data = ['name' => 'john','age' => 78,'hobby' => 'anime','job' => 'engineer'];
asort($data,SORT_LOCALE_STRING);
foreach($data as $key => $value){
    echo "$key : $value\n";
}

// 実行結果

/*
age : 78
hobby : anime
job : engineer
name : john
*/
```

#### ksort(), krsort()

- 配列のキーをもとに昇順、降順でソートする。

- 動作オプション指定可能

- [公式マニュアル](http://php.net/manual/ja/function.ksort.php)

- [公式マニュアル](http://php.net/manual/ja/function.krsort.php)

```php
// ksort(連想配列,動作オプション)

$data = ['name' => 'john','age' => 78,'hobby' => 'anime','job' => 'engineer'];
ksort($data);
foreach($data as $key => $value){
    echo "$key : $value\n";
}

// 実行結果

/*
age : 78
hobby : anime
job : engineer
name : john
*/
```

```php
// 動作オプション指定

$data = ['name' => 'john','age' => 78,'hobby' => 'anime','job' => 'engineer'];
ksort($data,SORT_NUMERIC);
foreach($data as $key => $value){
    echo "$key : $value\n";
}

// 実行結果

/*
name : john
age : 78
hobby : anime
job : engineer
*/
```

#### usort(), uasort(), uksort()

- ユーザー定義関数に基づき、配列をソートする。

- usortは、キーも並びかわる。

- uasortは、キーを変えずに並びかえる。

- uksortは、キーによって並びかえる。

- 動作オプション指定可能。

- [公式マニュアル](http://php.net/manual/ja/function.usort.php)

- [公式マニュアル](http://php.net/manual/ja/function.uasort.php)

- [公式マニュアル](http://php.net/manual/ja/function.uksort.php)

```php
// usort(配列,定義関数)

function comp($a, $b)
{
    return strcmp($a["name"], $b["name"]);
}

$names[0]["name"] = "tanaka";
$names[1]["name"] = "suzuki";
$names[2]["name"] = "ueno";

usort($names, "comp");

while (list($key, $value) = each($names)) {
    echo "\$names[$key]: " . $value["name"] . "\n";
}

// 実行結果

/*
$names[0]: suzuki
$names[1]: tanaka
$names[2]: ueno
*/
```

```php
// uasort(配列,定義関数)

function comp($a, $b)
{
    return strcmp($a["name"], $b["name"]);
}

$names[0]["name"] = "tanaka";
$names[1]["name"] = "suzuki";
$names[2]["name"] = "ueno";

uasort($names, "comp");

while (list($key, $value) = each($names)) {
    echo "\$names[$key]: " . $value["name"] . "\n";
}

// 実行結果

/*
$names[1]: suzuki
$names[0]: tanaka
$names[2]: ueno
*/
```

```php
function comp($a, $b)
{
    return strcmp($a["name"], $b["name"]);
}

$names[0]["name"] = "tanaka";
$names[1]["name"] = "suzuki";
$names[2]["name"] = "ueno";

uksort($names, "comp");

while (list($key, $value) = each($names)) {
    echo "\$names[$key]: " . $value["name"] . "\n";
}

// 実行結果

/*
$names[0]: tanaka
$names[1]: suzuki
$names[2]: ueno
*/
```

#### array_multisort()

- 複数の配列を他の配列の値をもとにソートする。

- [公式マニュアル](http://php.net/manual/ja/function.array-multisort.php)

```php
// array_multisort(並び変える配列,対象配列,オプション)

$numbers = array(15, 343, 55, 75);
$new_numbers = array(2, 4, 3, 7);
array_multisort($numbers, $new_numbers);
print_r($numbers);
print_r($new_numbers);

// 実行結果

/*
Array
(
    [0] => 15
    [1] => 55
    [2] => 75
    [3] => 343
)
Array
(
    [0] => 2
    [1] => 3
    [2] => 7
    [3] => 4
)
*/
```

#### array_unique()

- 配列から重複した値を削除して返す。

- [公式マニュアル](http://php.net/manual/ja/function.array-unique.php)

```php
// array_unique(配列)

$number = array(18, "17", "34", 343, 34, "38");
$result = array_unique($number);
print_r($result);

// 実行結果

/*
Array
(
    [0] => 18
    [1] => 17
    [2] => 34
    [3] => 343
    [5] => 38
)
*/
```

#### array_reverse()

- 配列の要素を逆順にして返す。

- [公式マニュアル](http://php.net/manual/ja/function.array-reverse.php)

```php
// array_reverse(配列)

$number = array(56,64,43,3,5,25,2,52);
$result = array_reverse($number);
print_r($result);

// 実行結果

/*
Array
(
    [0] => 52
    [1] => 2
    [2] => 25
    [3] => 5
    [4] => 3
    [5] => 43
    [6] => 64
    [7] => 56
)
*/
```

#### array_shift(), array_pop()

- array_shift() は配列の先頭から要素を取り出し、

- array_pop() は配列の末尾から要素を取り出す。

- 元の配列は取り出された分短くなる。

- [公式マニュアル](http://php.net/manual/ja/function.array-shift.php)

- [公式マニュアル](http://php.net/manual/ja/function.array-pop.php)

```php
// array_shift(配列)

$names = array('佐藤','高橋','鈴木','田中','黒川');
$result = array_shift($names);
print_r($names);

// 実行結果

/*
Array
(
    [0] => 高橋
    [1] => 鈴木
    [2] => 田中
    [3] => 黒川
)
*/
```

```php
// array_pop(配列)

$names = array('佐藤','高橋','鈴木','田中','黒川');
$result = array_pop($names);
print_r($names);

// 実行結果

/*
Array
(
    [0] => 佐藤
    [1] => 高橋
    [2] => 鈴木
    [3] => 田中
)
*/
```

#### array_walk(), array_walk_recursive()

- ユーザー定義関数を配列中のすべての値に適用する。

- arra_walk_recursive() は多次元配列に対して再帰的に処理する。

- [公式マニュアル](http://php.net/manual/ja/function.array-walk.php)

- [公式マニュアル](http://php.net/manual/ja/function.array-walk-recursive.php)

```php
// array_walk(配列,定義関数,引数オプション)

$array = array(10,20,30,40,50);
function ten_add (&$i) {
		$i += 10;
	}
array_walk($array,'tenAdd');
print_r($array);

// 実行結果

/*
Array
(
    [0] => 20
    [1] => 30
    [2] => 40
    [3] => 50
    [4] => 60
)
*/
```

```php
// array_walk_recursive(配列,定義関数,引数オプション)

$data = array('name' => '佐藤', 'age' => '67');
$info = array('company' => $data, 'friend' => 'たくさん');

function show_info($item, $key)
{
    echo "$key : $item\n";
}

array_walk_recursive($info, 'show_info');

// 実行結果

/*
name : 佐藤
age : 67
friend : たくさん
*/
```

#### array_search()

- 指定要素を配列から検索。

- 見つかった場合キー（要素番号）を返し、見つからなかった場合、falseを返す。

- 「型チェックオプション」は省略可能だが、型判定をきちんと行うために、指定する。

- [公式マニュアル](http://php.net/manual/ja/function.array-search.php)

```php
// array_search(検索値,配列,型チェックオプション)

$names = ['佐藤', '鈴木', '田中'];
$result = array_search('佐藤', $names,TRUE);
print_r($result);

// 実行結果

// 0
```

```php
$names = ['佐藤', '鈴木', '田中'];
$result = array_search('高橋', $names,TRUE);
echo $result;

// 実行結果

// (false)
```

#### implode(), explode()

- implode() は指定された区切り文字をもとに配列を文字列として結合。

- 指定配列は一次元配列である必要がある。

- explode() は指定された区切り文字を元に文字列を配列に変換する。

- [公式マニュアル](http://php.net/manual/ja/function.implode.php)

- [公式マニュアル](http://php.net/manual/ja/function.explode.php)

```php
// implode(区切り文字,配列)

$names = ['佐藤', '田中', '鈴木'];
$result = implode(',', $names);
echo $result;

// 実行結果

// 佐藤,田中,鈴木
```

```php
<?php
// explode ( 区切り文字列 , 対象の文字列 ,最大要素数 )

// 例1. 最大要素数指定なし。
$arrayDayList = explode("/","2019/02/28");
print_r($arrayDayList);

// 例2. 最大指定数指定あり。
$arrayEnglish = explode("/","A/B/C/D/E",2);
print_r($arrayEnglish);

// 実行結果

/*
Array
(
    [0] => 2019
    [1] => 02
    [2] => 28
)
*/
```

#### range()

- 指定された範囲の整数・文字を持つ配列を作成する。

- [公式マニュアル](http://php.net/manual/ja/function.range.php)

```php
// range(開始値,終了値,要素毎の増加数)

// 増加数指定無しの場合
foreach (range(0, 12) as $number) {
    echo $number;
}

// 実行結果

// 0123456789101112

// 増加数指定有りの場合
foreach (range('a', 'z',5) as $english) {
    echo $english;
}

// 実行結果

// afkpuz
```

#### current()

- 現在の配列のポインタが指す値取得。

- [公式マニュアル](http://php.net/manual/ja/function.current.php)

```php
// next($配列)

$names = array( "佐藤", "鈴木" , "田中" );
$name = current($names);
echo "$name";

// 実行結果

// 佐藤
```

#### next(), prev()

- next()は配列のポインタを進め、その値を取得。

- prev()は配列のポインタを戻し、その値を取得。

- [公式マニュアル](http://php.net/manual/ja/function.next.php)

- [公式マニュアル](http://php.net/manual/ja/function.prev.php)

```php
// next($配列)
// prev($配列)

$names = array( "佐藤", "鈴木" , "田中" );
$name = current($names);
echo "$name\n";
next($names);
$name = current($names);
echo "$name\n";
prev($names);
$name = current($names);
echo "$name";

// 実行結果

/*
佐藤
鈴木
佐藤
*/
```

#### reset(), end()

- reset()は配列のポインタを先頭の要素へ初期化し、その値を取得。

- reset()は配列のポインタを最後の要素へ進めて、その値を取得。

- 配列の最初や最後の要素を取得する目的で使うことが多い。

- [公式マニュアル](http://php.net/manual/ja/function.reset.php)

- [公式マニュアル](http://php.net/manual/ja/function.end.php)

```php
// reset($配列)
// end($配列)

$names = array( "佐藤", "鈴木" , "田中" );
$name = current($names);
echo "$name\n";
$names = array( "佐藤", "鈴木" , "田中" );
$name = next($names);
echo "$name\n";
$names = array( "佐藤", "鈴木" , "田中" );
$name = reset($names);
echo "$name\n";
$names = array( "佐藤", "鈴木" , "田中" );
$name = end($names);
echo "$name";

// 実行結果

/*
佐藤
鈴木
佐藤
田中
*/
```

#### extract()

- 配列を複数の変数に展開する。

- 引数に指定できるオプションは、「EXTR_OVERWRITE」以外にもたくさんある。

- `※信頼できない「$_GET」「$_POST」「$_FILES」には、絶対使わない`

- [公式マニュアル](http://php.net/manual/ja/function.extract.php)

```php
// extract($配列);

$data = array(
    "name" => "佐藤",
    "age" => "68",
    "hobby" => "アイドル鑑賞"
);
extract($data);
echo "名前 : {$name}";

//　実行結果

// 名前 : 佐藤
```

```php
// 「EXTR_OVERWRITE」オプションを指定して、既存の変数を上書き。

$name = '田中';

$data = array(
    "name" => "佐藤",
    "age" => "68",
    "hobby" => "アイドル鑑賞"
);
extract($data,EXTR_OVERWRITE);
echo "名前 : {$name}";

// 実行結果

// 名前 : 佐藤
```

#### list()

- 配列の値を、複数の変数に代入。

- 厳密には関数ではなく言語構造である。

- [公式マニュアル](http://php.net/manual/ja/function.list.php)

```php
// list(変数) = 配列

$data = array('佐藤', '12', '読書');
list($name, $age, $hobby) = $data;
echo "名前 : " . $name;

// 実行結果

// 名前 : 佐藤
```

```php
$names = ['佐藤','田中','鈴木','鈴木','小松'];
$items = ['item1', 'item2', 'item3'];
 
list($names[0], $names[2]) = $items;
 
print_r($names);

// 実行結果

/*
Array
(
    [0] => item1
    [1] => 田中
    [2] => item2
    [3] => 鈴木
    [4] => 小松
)
*/
```

#### is_array()

- 渡された変数が配列であるかを返す。

- [公式マニュアル](http://php.net/manual/ja/function.is-array.php)

```php
// is_array(変数)

$data = array("東京","大阪","福岡");
is_array($data)
if (is_array($data) ) {
　echo "配列です";
} else {
　echo "配列ではありません";
}

// 実行結果

// 配列です
```

## まとめ
- 今回は、PHP関数メモの第二回目ということで、「この整理が完了しても、常に大量の情報を欲している検索魔のため、この予防運動は無意味である」という突き付けられた運命を受け入れながら、記事を書く。
- 「[公式マニュアル](http://php.net/)」や「[逆引き大全](https://www.shuwasystem.co.jp/book/9784798030937.html)」での膨大な量から、すかさず逃避して「ネットの参考記事の項目をそのまま使う」という、他人依存優等生をこの上なく発揮。
- 「とはいえ、この関数整理も残り少なくなってくると、愛着がわき、さびしいものだ」という、医学的にも解明されている人間的思考に、しっかり陥りながら、次の整理をすることにしよう。

## 参考
- https://php-archive.net/php/essential-php-functions/  
→今回もこちらの記事を参考にしました。大変お世話になりました。