PHP　配列の基礎まとめ

PHP v5.5.30

基本的に配列が苦手でいつも似たような内容で間違って詰まるので、確認用にまとめる。

## 配列
### 初期化
```
// 空の配列を定義
$ar = [];
```
```
// 配列に中身を入れた状態で定義
$ar = [1, 2, 'hoge'];
```

### 中身を確認
```
pr($ar);exit;
```

```
// 出力結果
Array
(
    [0] => 1
    [1] => 2
    [2] => hoge
)
```

### 配列に値の追加
```
// 初期化
$ar = [1, 2, 'hoge'];
```

- 配列番号を指定しない場合

```
// 値の追加
$ar[] = 4;
```

キーを指定せず要素を追加すると、追加される数字添字は、使用されている添字の最大値+1が振られた状態で配列の一番後ろに代入される。

```
// 出力結果
Array
(
  [0] => 1
  [1] => 2
  [2] => hoge
  [3] => 4
)
```

- 配列番号を指定した場合

```
// 値の追加
$ar[10] = 4;
```

配列番号を指定して値を追加すると、配列の番号が決められた状態で配列の一番後ろに代入される。

```
// 出力結果
Array
(
  [0] => 1
  [1] => 2
  [2] => hoge
  [10] => 4
)
```

### 定義いろいろ
- 配列の番号を順番関係なく指定した場合

```
$ar = [];
$ar[0] = 'a';
$ar[2] = 'c';
$ar[1] = 'b';
```

```
// 出力結果
Array
(
    [0] => a
    [2] => c
    [1] => b
)
```

- 配列の番号を指定した時と指定していない時を混在させた場合

```
$ar = [];
$ar[0] = 'a';
$ar[2] = 'c';
$ar[] = 'b';
```

キーを省略しているので、ここでは3(使用されている添字の最大値+1)が追加される。

```
// 出力結果
Array
(
    [0] => a
    [2] => c
    [3] => b
)
```

- 添字に文字列や真偽値を使用した場合

```
$ar = [];
pr($ar);
$ar[1] = 'a';
pr($ar);
$ar['1'] = 'b';
pr($ar);
$ar[true] = 'c';
pr($ar);
$ar[0] = 'd';
pr($ar);
$ar['0'] = 'e';
pr($ar);
$ar[false] = 'f';
pr($ar);
$ar[null] = 'g';
pr($ar);
$ar[''] = 'h';
pr($ar);
exit;
```

```
// 出力結果
Array
(
)
// 添字の数字を文字列にした時の結果は同じ
Array
(
    [1] => a
)
Array
(
    [1] => b
)
// 添字がtrueの時は1として扱う
Array
(
    [1] => c
)
// 添字の数字と文字列は同等なので値が上書き
Array
(
    [1] => c
    [0] => d
)
Array
(
    [1] => c
    [0] => e
)
// 添字がfalseの時は0として扱う
Array
(
    [1] => c
    [0] => f
)
// 添字がnullと''は同等に扱う
// キーは空になる
Array
(
    [1] => c
    [0] => f
    [] => g
)
Array
(
    [1] => c
    [0] => f
    [] => h
)
```

### 間違った配列の初期化
```
// 配列の初期化
$ar[] = [1, 2, 'hoge'];
```

`$ar[] = ○○`というのは値を代入する形であるため、配列の初期化には使わないほうがいい。
一応、初期化はできるため、以下の様な配列が出力される。

```
// 出力結果
Array
(
  [0] => Array
    (
      [0] => 1
      [1] => 2
      [2] => hoge
    )
)
```

しかし、上記の初期化方法では、以下のように`$ar`に配列以外の値が入っているとエラーが出力される。

```
$ar = 'hoge'
$ar[] = [1, 2, 'hoge'];
```

以下のような、正しい配列の初期化だと単純に変数を上書きして初期化するのでエラーは出力されない。

```
$ar = 'hoge'
$ar = [1, 2, 'hoge'];
```

## 連想配列
### 初期化
```
$ar = [
	'name' => 'dog',
	'age' => 7,
];
pr($ar);exit;
```

```
// 出力結果
Array
(
    [name] => dog
    [age] => 7
)
```

### 値を変更
```
$ar = [
	'name' => 'dog',
	'age' => 7,
];
$ar['name'] = 'cat';
pr($ar);exit;
```

```
// 実行結果
Array
(
    [name] => cat
    [age] => 7
)
```

### 連想配列にキーと値の追加
```
$ar = [
	'name' => 'dog',
	'age' => 7,
];
$ar['height'] = 35;
pr($ar);exit;
```

```
// 実行結果
Array
(
    [name] => cat
    [age] => 7
    [height] => 35
)
```

### 値の取り出し
```
$ar = [
	'name' => 'dog',
	'age' => 7,
	'height' => 35,
	'weight' => 8,
];
pr($ar['name']);
pr($ar['weight']);
exit;
```

```
// 出力結果
dog
8
```

### 2次元配列の場合の値の追加、書き換え、取り出し
```
$ar = [
	'animal' => [
		'dog',
		'cat',
	],
	'plase' => 'Iwate',
	'food' => [
		'dog_food',
		'cat_food',
	],
];
pr($ar);
// animalキーにrabbitを追加
$ar['animal'][] = 'rabbit';
pr($ar);
// animalキーの2番めの値をhamsterに書き換え
$ar['animal'][2] = 'hamster';
pr($ar);
// drinkキー、waterを追加
$ar['drink'][] = 'water';
// 変数を利用してdorinkキーにmiso_soopを追加
$soop = 'miso_soop';
$ar['drink'][] = $soop;
pr($ar);
// 値の取り出し
pr($ar['animal'][2]);
pr($ar['food'][0]);

exit;
```

```
// 実行結果
Array
(
    [animal] => Array
        (
            [0] => dog
            [1] => cat
        )

    [plase] => Iwate
    [food] => Array
        (
            [0] => dog_food
            [1] => cat_food
        )

)
// animalキーにrabbitを追加
Array
(
    [animal] => Array
        (
            [0] => dog
            [1] => cat
            [2] => rabbit
        )

    [plase] => Iwate
    [food] => Array
        (
            [0] => dog_food
            [1] => cat_food
        )

)
// animalキーの2番めの値をhamsterに書き換え
Array
(
    [animal] => Array
        (
            [0] => dog
            [1] => cat
            [2] => hamster
        )

    [plase] => Iwate
    [food] => Array
        (
            [0] => dog_food
            [1] => cat_food
        )

)
// drinkキー、waterを追加
// 変数を利用してdorinkキーにmiso_soopを追加
Array
(
    [animal] => Array
        (
            [0] => dog
            [1] => cat
            [2] => hamster
        )

    [plase] => Iwate
    [food] => Array
        (
            [0] => dog_food
            [1] => cat_food
        )

    [drink] => Array
        (
            [0] => water
            [1] => miso_soop
        )

)
// 値の取り出し
hamster
dog_food
```